diff options
| author | Andrea Corallo | 2019-06-30 13:30:49 +0200 |
|---|---|---|
| committer | Andrea Corallo | 2020-01-01 11:33:47 +0100 |
| commit | 0bdbd4a6012be487e440521e331c6dfc330c2197 (patch) | |
| tree | 8950091fa730007e1b141ab7393da1d8493dc54d /src | |
| parent | 45c1b64ce68ea4416141d66af07bb24f4fda9930 (diff) | |
| download | emacs-0bdbd4a6012be487e440521e331c6dfc330c2197.tar.gz emacs-0bdbd4a6012be487e440521e331c6dfc330c2197.zip | |
introduce stack_el_t
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp.c | 145 |
1 files changed, 75 insertions, 70 deletions
diff --git a/src/comp.c b/src/comp.c index fa5b6217169..027090dc6ee 100644 --- a/src/comp.c +++ b/src/comp.c | |||
| @@ -47,7 +47,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 47 | CHECK_STACK; \ | 47 | CHECK_STACK; \ |
| 48 | gcc_jit_block_add_assignment (comp.block->gcc_bb, \ | 48 | gcc_jit_block_add_assignment (comp.block->gcc_bb, \ |
| 49 | NULL, \ | 49 | NULL, \ |
| 50 | *stack, \ | 50 | (stack)->gcc_lval, \ |
| 51 | gcc_jit_lvalue_as_rvalue(obj)); \ | 51 | gcc_jit_lvalue_as_rvalue(obj)); \ |
| 52 | stack++; \ | 52 | stack++; \ |
| 53 | } while (0) | 53 | } while (0) |
| @@ -57,7 +57,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 57 | CHECK_STACK; \ | 57 | CHECK_STACK; \ |
| 58 | gcc_jit_block_add_assignment (comp.block->gcc_bb, \ | 58 | gcc_jit_block_add_assignment (comp.block->gcc_bb, \ |
| 59 | NULL, \ | 59 | NULL, \ |
| 60 | *stack, \ | 60 | (stack)->gcc_lval, \ |
| 61 | (obj)); \ | 61 | (obj)); \ |
| 62 | stack++; \ | 62 | stack++; \ |
| 63 | } while (0) | 63 | } while (0) |
| @@ -69,7 +69,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 69 | CHECK_STACK; \ | 69 | CHECK_STACK; \ |
| 70 | gcc_jit_block_add_assignment (prologue_bb, \ | 70 | gcc_jit_block_add_assignment (prologue_bb, \ |
| 71 | NULL, \ | 71 | NULL, \ |
| 72 | *stack, \ | 72 | (stack)->gcc_lval, \ |
| 73 | gcc_jit_param_as_rvalue(obj)); \ | 73 | gcc_jit_param_as_rvalue(obj)); \ |
| 74 | stack++; \ | 74 | stack++; \ |
| 75 | } while (0) | 75 | } while (0) |
| @@ -80,31 +80,31 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 80 | 80 | ||
| 81 | #define POP0 | 81 | #define POP0 |
| 82 | 82 | ||
| 83 | #define POP1 \ | 83 | #define POP1 \ |
| 84 | do { \ | 84 | do { \ |
| 85 | stack--; \ | 85 | stack--; \ |
| 86 | CHECK_STACK; \ | 86 | CHECK_STACK; \ |
| 87 | args[0] = gcc_jit_lvalue_as_rvalue (*stack); \ | 87 | args[0] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 88 | } while (0) | 88 | } while (0) |
| 89 | 89 | ||
| 90 | #define POP2 \ | 90 | #define POP2 \ |
| 91 | do { \ | 91 | do { \ |
| 92 | stack--; \ | 92 | stack--; \ |
| 93 | CHECK_STACK; \ | 93 | CHECK_STACK; \ |
| 94 | args[1] = gcc_jit_lvalue_as_rvalue (*stack); \ | 94 | args[1] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 95 | stack--; \ | 95 | stack--; \ |
| 96 | args[0] = gcc_jit_lvalue_as_rvalue (*stack); \ | 96 | args[0] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 97 | } while (0) | 97 | } while (0) |
| 98 | 98 | ||
| 99 | #define POP3 \ | 99 | #define POP3 \ |
| 100 | do { \ | 100 | do { \ |
| 101 | stack--; \ | 101 | stack--; \ |
| 102 | CHECK_STACK; \ | 102 | CHECK_STACK; \ |
| 103 | args[2] = gcc_jit_lvalue_as_rvalue (*stack); \ | 103 | args[2] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 104 | stack--; \ | 104 | stack--; \ |
| 105 | args[1] = gcc_jit_lvalue_as_rvalue (*stack); \ | 105 | args[1] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 106 | stack--; \ | 106 | stack--; \ |
| 107 | args[0] = gcc_jit_lvalue_as_rvalue (*stack); \ | 107 | args[0] = gcc_jit_lvalue_as_rvalue ((stack)->gcc_lval); \ |
| 108 | } while (0) | 108 | } while (0) |
| 109 | 109 | ||
| 110 | /* Fetch the next byte from the bytecode stream. */ | 110 | /* Fetch the next byte from the bytecode stream. */ |
| @@ -146,11 +146,11 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 146 | This is done by passing a reference to the first obj involved on the stack. | 146 | This is done by passing a reference to the first obj involved on the stack. |
| 147 | */ | 147 | */ |
| 148 | 148 | ||
| 149 | #define EMIT_CALL_N_REF(name, nargs) \ | 149 | #define EMIT_CALL_N_REF(name, nargs) \ |
| 150 | do { \ | 150 | do { \ |
| 151 | DISCARD (nargs); \ | 151 | DISCARD (nargs); \ |
| 152 | res = emit_call_n_ref ((name), (nargs), *stack); \ | 152 | res = emit_call_n_ref ((name), (nargs), (stack)->gcc_lval); \ |
| 153 | PUSH_RVAL (res); \ | 153 | PUSH_RVAL (res); \ |
| 154 | } while (0) | 154 | } while (0) |
| 155 | 155 | ||
| 156 | #define EMIT_ARITHCOMPARE(comparison) \ | 156 | #define EMIT_ARITHCOMPARE(comparison) \ |
| @@ -176,10 +176,15 @@ do { \ | |||
| 176 | basic_block_t *(name); \ | 176 | basic_block_t *(name); \ |
| 177 | SAFE_ALLOCA_BLOCK ((name), (func), STR(name)) | 177 | SAFE_ALLOCA_BLOCK ((name), (func), STR(name)) |
| 178 | 178 | ||
| 179 | /* Element of the meta stack. */ | ||
| 180 | typedef struct { | ||
| 181 | gcc_jit_lvalue *gcc_lval; | ||
| 182 | } stack_el_t; | ||
| 183 | |||
| 179 | typedef struct { | 184 | typedef struct { |
| 180 | gcc_jit_block *gcc_bb; | 185 | gcc_jit_block *gcc_bb; |
| 181 | /* When non zero indicates a stack pointer restart. */ | 186 | /* When non zero indicates a stack pointer restart. */ |
| 182 | gcc_jit_lvalue **top; | 187 | stack_el_t *top; |
| 183 | bool terminated; | 188 | bool terminated; |
| 184 | } basic_block_t; | 189 | } basic_block_t; |
| 185 | 190 | ||
| @@ -298,14 +303,14 @@ bcall0 (Lisp_Object f) | |||
| 298 | order. */ | 303 | order. */ |
| 299 | 304 | ||
| 300 | INLINE static void | 305 | INLINE static void |
| 301 | pop (unsigned n, gcc_jit_lvalue ***stack_ref, gcc_jit_rvalue *args[]) | 306 | pop (unsigned n, stack_el_t **stack_ref, gcc_jit_rvalue *args[]) |
| 302 | { | 307 | { |
| 303 | gcc_jit_lvalue **stack = *stack_ref; | 308 | stack_el_t *stack = *stack_ref; |
| 304 | 309 | ||
| 305 | while (n--) | 310 | while (n--) |
| 306 | { | 311 | { |
| 307 | stack--; | 312 | stack--; |
| 308 | args[n] = gcc_jit_lvalue_as_rvalue (*stack); | 313 | args[n] = gcc_jit_lvalue_as_rvalue (stack->gcc_lval); |
| 309 | } | 314 | } |
| 310 | 315 | ||
| 311 | *stack_ref = stack; | 316 | *stack_ref = stack; |
| @@ -2039,9 +2044,9 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2039 | 2044 | ||
| 2040 | /* Meta-stack we use to flat the bytecode written for push and pop | 2045 | /* Meta-stack we use to flat the bytecode written for push and pop |
| 2041 | Emacs VM.*/ | 2046 | Emacs VM.*/ |
| 2042 | gcc_jit_lvalue **stack_base, **stack, **stack_over; | 2047 | stack_el_t *stack_base, *stack, *stack_over; |
| 2043 | stack_base = stack = | 2048 | SAFE_NALLOCA (stack_base, sizeof (stack_el_t), stack_depth); |
| 2044 | (gcc_jit_lvalue **) xmalloc (stack_depth * sizeof (gcc_jit_lvalue *)); | 2049 | stack = stack_base; |
| 2045 | stack_over = stack_base + stack_depth; | 2050 | stack_over = stack_base + stack_depth; |
| 2046 | 2051 | ||
| 2047 | if (FIXNUMP (args_template)) | 2052 | if (FIXNUMP (args_template)) |
| @@ -2081,13 +2086,13 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2081 | "local"); | 2086 | "local"); |
| 2082 | 2087 | ||
| 2083 | for (int i = 0; i < stack_depth; ++i) | 2088 | for (int i = 0; i < stack_depth; ++i) |
| 2084 | stack[i] = gcc_jit_context_new_array_access ( | 2089 | stack[i].gcc_lval = gcc_jit_context_new_array_access ( |
| 2085 | comp.ctxt, | 2090 | comp.ctxt, |
| 2086 | NULL, | 2091 | NULL, |
| 2087 | gcc_jit_lvalue_as_rvalue (meta_stack_array), | 2092 | gcc_jit_lvalue_as_rvalue (meta_stack_array), |
| 2088 | gcc_jit_context_new_rvalue_from_int (comp.ctxt, | 2093 | gcc_jit_context_new_rvalue_from_int (comp.ctxt, |
| 2089 | comp.int_type, | 2094 | comp.int_type, |
| 2090 | i)); | 2095 | i)); |
| 2091 | 2096 | ||
| 2092 | gcc_jit_block *prologue_bb = | 2097 | gcc_jit_block *prologue_bb = |
| 2093 | gcc_jit_function_new_block (comp.func, "prologue"); | 2098 | gcc_jit_function_new_block (comp.func, "prologue"); |
| @@ -2132,15 +2137,16 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2132 | goto stack_ref; | 2137 | goto stack_ref; |
| 2133 | CASE (Bstack_ref5); | 2138 | CASE (Bstack_ref5); |
| 2134 | stack_ref: | 2139 | stack_ref: |
| 2135 | PUSH_LVAL (stack_base[(stack - stack_base) - (op - Bstack_ref) - 1]); | 2140 | PUSH_LVAL ( |
| 2141 | stack_base[(stack - stack_base) - (op - Bstack_ref) - 1].gcc_lval); | ||
| 2136 | break; | 2142 | break; |
| 2137 | 2143 | ||
| 2138 | CASE (Bstack_ref6); | 2144 | CASE (Bstack_ref6); |
| 2139 | PUSH_LVAL (stack_base[(stack - stack_base) - FETCH - 1]); | 2145 | PUSH_LVAL (stack_base[(stack - stack_base) - FETCH - 1].gcc_lval); |
| 2140 | break; | 2146 | break; |
| 2141 | 2147 | ||
| 2142 | CASE (Bstack_ref7); | 2148 | CASE (Bstack_ref7); |
| 2143 | PUSH_LVAL (stack_base[(stack - stack_base) - FETCH2 - 1]); | 2149 | PUSH_LVAL (stack_base[(stack - stack_base) - FETCH2 - 1].gcc_lval); |
| 2144 | break; | 2150 | break; |
| 2145 | 2151 | ||
| 2146 | CASE (Bvarref7); | 2152 | CASE (Bvarref7); |
| @@ -2262,7 +2268,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2262 | { | 2268 | { |
| 2263 | ptrdiff_t nargs = op + 1; | 2269 | ptrdiff_t nargs = op + 1; |
| 2264 | DISCARD (nargs); | 2270 | DISCARD (nargs); |
| 2265 | res = emit_call_n_ref ("Ffuncall", nargs, *stack); | 2271 | res = emit_call_n_ref ("Ffuncall", nargs, stack->gcc_lval); |
| 2266 | PUSH_RVAL (res); | 2272 | PUSH_RVAL (res); |
| 2267 | break; | 2273 | break; |
| 2268 | } | 2274 | } |
| @@ -2365,7 +2371,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2365 | 2371 | ||
| 2366 | emit_cond_jump (res, push_h_val_block, &bb_map[pc]); | 2372 | emit_cond_jump (res, push_h_val_block, &bb_map[pc]); |
| 2367 | 2373 | ||
| 2368 | gcc_jit_lvalue **stack_to_restore = stack; | 2374 | stack_el_t *stack_to_restore = stack; |
| 2369 | /* This emit the handler part. */ | 2375 | /* This emit the handler part. */ |
| 2370 | 2376 | ||
| 2371 | basic_block_t *bb_orig = comp.block; | 2377 | basic_block_t *bb_orig = comp.block; |
| @@ -2384,10 +2390,10 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2384 | NULL, | 2390 | NULL, |
| 2385 | comp.handler_next_field))); | 2391 | comp.handler_next_field))); |
| 2386 | /* PUSH (c->val); */ | 2392 | /* PUSH (c->val); */ |
| 2387 | PUSH_LVAL ( | 2393 | PUSH_LVAL (gcc_jit_rvalue_dereference_field ( |
| 2388 | gcc_jit_rvalue_dereference_field (gcc_jit_lvalue_as_rvalue (c), | 2394 | gcc_jit_lvalue_as_rvalue (c), |
| 2389 | NULL, | 2395 | NULL, |
| 2390 | comp.handler_val_field)); | 2396 | comp.handler_val_field)); |
| 2391 | bb_map[handler_pc].top = stack; | 2397 | bb_map[handler_pc].top = stack; |
| 2392 | comp.block = bb_orig; | 2398 | comp.block = bb_orig; |
| 2393 | 2399 | ||
| @@ -2501,7 +2507,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2501 | DECL_AND_SAFE_ALLOCA_BLOCK (sub1_fcall_block, comp.func); | 2507 | DECL_AND_SAFE_ALLOCA_BLOCK (sub1_fcall_block, comp.func); |
| 2502 | 2508 | ||
| 2503 | gcc_jit_rvalue *tos_as_num = | 2509 | gcc_jit_rvalue *tos_as_num = |
| 2504 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS)); | 2510 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval)); |
| 2505 | 2511 | ||
| 2506 | emit_cond_jump ( | 2512 | emit_cond_jump ( |
| 2507 | gcc_jit_context_new_binary_op ( | 2513 | gcc_jit_context_new_binary_op ( |
| @@ -2510,7 +2516,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2510 | GCC_JIT_BINARY_OP_LOGICAL_AND, | 2516 | GCC_JIT_BINARY_OP_LOGICAL_AND, |
| 2511 | comp.bool_type, | 2517 | comp.bool_type, |
| 2512 | emit_cast (comp.bool_type, | 2518 | emit_cast (comp.bool_type, |
| 2513 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS))), | 2519 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval))), |
| 2514 | gcc_jit_context_new_comparison (comp.ctxt, | 2520 | gcc_jit_context_new_comparison (comp.ctxt, |
| 2515 | NULL, | 2521 | NULL, |
| 2516 | GCC_JIT_COMPARISON_NE, | 2522 | GCC_JIT_COMPARISON_NE, |
| @@ -2532,7 +2538,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2532 | comp.block = sub1_inline_block; | 2538 | comp.block = sub1_inline_block; |
| 2533 | gcc_jit_block_add_assignment (sub1_inline_block->gcc_bb, | 2539 | gcc_jit_block_add_assignment (sub1_inline_block->gcc_bb, |
| 2534 | NULL, | 2540 | NULL, |
| 2535 | TOS, | 2541 | TOS.gcc_lval, |
| 2536 | emit_make_fixnum (sub1_inline_res)); | 2542 | emit_make_fixnum (sub1_inline_res)); |
| 2537 | 2543 | ||
| 2538 | comp.block = sub1_fcall_block; | 2544 | comp.block = sub1_fcall_block; |
| @@ -2561,7 +2567,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2561 | DECL_AND_SAFE_ALLOCA_BLOCK (add1_fcall_block, comp.func); | 2567 | DECL_AND_SAFE_ALLOCA_BLOCK (add1_fcall_block, comp.func); |
| 2562 | 2568 | ||
| 2563 | gcc_jit_rvalue *tos_as_num = | 2569 | gcc_jit_rvalue *tos_as_num = |
| 2564 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS)); | 2570 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval)); |
| 2565 | 2571 | ||
| 2566 | emit_cond_jump ( | 2572 | emit_cond_jump ( |
| 2567 | gcc_jit_context_new_binary_op ( | 2573 | gcc_jit_context_new_binary_op ( |
| @@ -2570,7 +2576,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2570 | GCC_JIT_BINARY_OP_LOGICAL_AND, | 2576 | GCC_JIT_BINARY_OP_LOGICAL_AND, |
| 2571 | comp.bool_type, | 2577 | comp.bool_type, |
| 2572 | emit_cast (comp.bool_type, | 2578 | emit_cast (comp.bool_type, |
| 2573 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS))), | 2579 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval))), |
| 2574 | gcc_jit_context_new_comparison (comp.ctxt, | 2580 | gcc_jit_context_new_comparison (comp.ctxt, |
| 2575 | NULL, | 2581 | NULL, |
| 2576 | GCC_JIT_COMPARISON_NE, | 2582 | GCC_JIT_COMPARISON_NE, |
| @@ -2593,7 +2599,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2593 | gcc_jit_block_add_assignment (add1_inline_block->gcc_bb | 2599 | gcc_jit_block_add_assignment (add1_inline_block->gcc_bb |
| 2594 | , | 2600 | , |
| 2595 | NULL, | 2601 | NULL, |
| 2596 | TOS, | 2602 | TOS.gcc_lval, |
| 2597 | emit_make_fixnum (add1_inline_res)); | 2603 | emit_make_fixnum (add1_inline_res)); |
| 2598 | comp.block = add1_fcall_block; | 2604 | comp.block = add1_fcall_block; |
| 2599 | POP1; | 2605 | POP1; |
| @@ -2645,7 +2651,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2645 | DECL_AND_SAFE_ALLOCA_BLOCK (negate_fcall_block, comp.func); | 2651 | DECL_AND_SAFE_ALLOCA_BLOCK (negate_fcall_block, comp.func); |
| 2646 | 2652 | ||
| 2647 | gcc_jit_rvalue *tos_as_num = | 2653 | gcc_jit_rvalue *tos_as_num = |
| 2648 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS)); | 2654 | emit_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval)); |
| 2649 | 2655 | ||
| 2650 | emit_cond_jump ( | 2656 | emit_cond_jump ( |
| 2651 | gcc_jit_context_new_binary_op ( | 2657 | gcc_jit_context_new_binary_op ( |
| @@ -2654,7 +2660,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2654 | GCC_JIT_BINARY_OP_LOGICAL_AND, | 2660 | GCC_JIT_BINARY_OP_LOGICAL_AND, |
| 2655 | comp.bool_type, | 2661 | comp.bool_type, |
| 2656 | emit_cast (comp.bool_type, | 2662 | emit_cast (comp.bool_type, |
| 2657 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS))), | 2663 | emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS.gcc_lval))), |
| 2658 | gcc_jit_context_new_comparison (comp.ctxt, | 2664 | gcc_jit_context_new_comparison (comp.ctxt, |
| 2659 | NULL, | 2665 | NULL, |
| 2660 | GCC_JIT_COMPARISON_NE, | 2666 | GCC_JIT_COMPARISON_NE, |
| @@ -2675,7 +2681,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2675 | comp.block = negate_inline_block; | 2681 | comp.block = negate_inline_block; |
| 2676 | gcc_jit_block_add_assignment (negate_inline_block->gcc_bb, | 2682 | gcc_jit_block_add_assignment (negate_inline_block->gcc_bb, |
| 2677 | NULL, | 2683 | NULL, |
| 2678 | TOS, | 2684 | TOS.gcc_lval, |
| 2679 | emit_make_fixnum (negate_inline_res)); | 2685 | emit_make_fixnum (negate_inline_res)); |
| 2680 | 2686 | ||
| 2681 | comp.block = negate_fcall_block; | 2687 | comp.block = negate_fcall_block; |
| @@ -2827,7 +2833,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2827 | CASE (Bgotoifnilelsepop); | 2833 | CASE (Bgotoifnilelsepop); |
| 2828 | op = FETCH2; | 2834 | op = FETCH2; |
| 2829 | emit_comparison_jump (GCC_JIT_COMPARISON_EQ, | 2835 | emit_comparison_jump (GCC_JIT_COMPARISON_EQ, |
| 2830 | gcc_jit_lvalue_as_rvalue (TOS), | 2836 | gcc_jit_lvalue_as_rvalue (TOS.gcc_lval), |
| 2831 | nil, | 2837 | nil, |
| 2832 | &bb_map[op], &bb_map[pc]); | 2838 | &bb_map[op], &bb_map[pc]); |
| 2833 | bb_map[op].top = stack; | 2839 | bb_map[op].top = stack; |
| @@ -2837,7 +2843,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2837 | CASE (Bgotoifnonnilelsepop); | 2843 | CASE (Bgotoifnonnilelsepop); |
| 2838 | op = FETCH2; | 2844 | op = FETCH2; |
| 2839 | emit_comparison_jump (GCC_JIT_COMPARISON_NE, | 2845 | emit_comparison_jump (GCC_JIT_COMPARISON_NE, |
| 2840 | gcc_jit_lvalue_as_rvalue (TOS), | 2846 | gcc_jit_lvalue_as_rvalue (TOS.gcc_lval), |
| 2841 | nil, | 2847 | nil, |
| 2842 | &bb_map[op], &bb_map[pc]); | 2848 | &bb_map[op], &bb_map[pc]); |
| 2843 | bb_map[op].top = stack; | 2849 | bb_map[op].top = stack; |
| @@ -2857,7 +2863,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 2857 | break; | 2863 | break; |
| 2858 | 2864 | ||
| 2859 | CASE (Bdup); | 2865 | CASE (Bdup); |
| 2860 | PUSH_LVAL (TOS); | 2866 | PUSH_LVAL (TOS.gcc_lval); |
| 2861 | break; | 2867 | break; |
| 2862 | 2868 | ||
| 2863 | CASE (Bsave_excursion); | 2869 | CASE (Bsave_excursion); |
| @@ -3022,7 +3028,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3022 | op = FETCH - 128; | 3028 | op = FETCH - 128; |
| 3023 | op += pc; | 3029 | op += pc; |
| 3024 | emit_comparison_jump (GCC_JIT_COMPARISON_EQ, | 3030 | emit_comparison_jump (GCC_JIT_COMPARISON_EQ, |
| 3025 | gcc_jit_lvalue_as_rvalue (TOS), | 3031 | gcc_jit_lvalue_as_rvalue (TOS.gcc_lval), |
| 3026 | nil, | 3032 | nil, |
| 3027 | &bb_map[op], &bb_map[pc]); | 3033 | &bb_map[op], &bb_map[pc]); |
| 3028 | bb_map[op].top = stack; | 3034 | bb_map[op].top = stack; |
| @@ -3033,7 +3039,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3033 | op = FETCH - 128; | 3039 | op = FETCH - 128; |
| 3034 | op += pc; | 3040 | op += pc; |
| 3035 | emit_comparison_jump (GCC_JIT_COMPARISON_NE, | 3041 | emit_comparison_jump (GCC_JIT_COMPARISON_NE, |
| 3036 | gcc_jit_lvalue_as_rvalue (TOS), | 3042 | gcc_jit_lvalue_as_rvalue (TOS.gcc_lval), |
| 3037 | nil, | 3043 | nil, |
| 3038 | &bb_map[op], &bb_map[pc]); | 3044 | &bb_map[op], &bb_map[pc]); |
| 3039 | bb_map[op].top = stack; | 3045 | bb_map[op].top = stack; |
| @@ -3052,7 +3058,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3052 | if (op > 0) | 3058 | if (op > 0) |
| 3053 | gcc_jit_block_add_assignment (comp.block->gcc_bb, | 3059 | gcc_jit_block_add_assignment (comp.block->gcc_bb, |
| 3054 | NULL, | 3060 | NULL, |
| 3055 | *(stack - op), | 3061 | (*(stack - op)).gcc_lval, |
| 3056 | args[0]); | 3062 | args[0]); |
| 3057 | break; | 3063 | break; |
| 3058 | 3064 | ||
| @@ -3061,7 +3067,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3061 | POP1; | 3067 | POP1; |
| 3062 | gcc_jit_block_add_assignment (comp.block->gcc_bb, | 3068 | gcc_jit_block_add_assignment (comp.block->gcc_bb, |
| 3063 | NULL, | 3069 | NULL, |
| 3064 | *(stack - op), | 3070 | (*(stack - op)).gcc_lval, |
| 3065 | args[0]); | 3071 | args[0]); |
| 3066 | break; | 3072 | break; |
| 3067 | 3073 | ||
| @@ -3073,7 +3079,7 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3073 | POP1; | 3079 | POP1; |
| 3074 | gcc_jit_block_add_assignment (comp.block->gcc_bb, | 3080 | gcc_jit_block_add_assignment (comp.block->gcc_bb, |
| 3075 | NULL, | 3081 | NULL, |
| 3076 | *(stack - op - 1), | 3082 | (*(stack - op - 1)).gcc_lval, |
| 3077 | args[0]); | 3083 | args[0]); |
| 3078 | } | 3084 | } |
| 3079 | 3085 | ||
| @@ -3122,7 +3128,6 @@ compile_f (const char *lisp_f_name, const char *c_f_name, | |||
| 3122 | error ("Something went wrong"); | 3128 | error ("Something went wrong"); |
| 3123 | 3129 | ||
| 3124 | exit: | 3130 | exit: |
| 3125 | xfree (stack_base); | ||
| 3126 | xfree (bb_map); | 3131 | xfree (bb_map); |
| 3127 | SAFE_FREE (); | 3132 | SAFE_FREE (); |
| 3128 | return comp_res; | 3133 | return comp_res; |