aboutsummaryrefslogtreecommitdiffstats
path: root/src/comp.c
diff options
context:
space:
mode:
authorAndrea Corallo2019-06-10 10:34:04 +0200
committerAndrea Corallo2020-01-01 11:33:40 +0100
commit097f36bc75a6570e64f80451ae4bbe2172d610e0 (patch)
tree2ccd7315056c85cb82c446671528f780d09f53c3 /src/comp.c
parentf867699b23ad012ad71f08f88ecf3e0e8df045da (diff)
downloademacs-097f36bc75a6570e64f80451ae4bbe2172d610e0.tar.gz
emacs-097f36bc75a6570e64f80451ae4bbe2172d610e0.zip
add Badd1 support
Diffstat (limited to 'src/comp.c')
-rw-r--r--src/comp.c63
1 files changed, 60 insertions, 3 deletions
diff --git a/src/comp.c b/src/comp.c
index ede417c794f..3cb51892959 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -633,6 +633,7 @@ compute_bblocks (ptrdiff_t bytestr_length, unsigned char *bytestr_data)
633 new_bb = true; 633 new_bb = true;
634 break; 634 break;
635 case Bsub1: 635 case Bsub1:
636 case Badd1:
636 case Breturn: 637 case Breturn:
637 new_bb = true; 638 new_bb = true;
638 break; 639 break;
@@ -1004,9 +1005,9 @@ compile_f (const char *f_name, ptrdiff_t bytestr_length,
1004 : Fsub1 (TOP)) */ 1005 : Fsub1 (TOP)) */
1005 1006
1006 gcc_jit_block *sub1_inline_block = 1007 gcc_jit_block *sub1_inline_block =
1007 gcc_jit_function_new_block (comp.func, "inline-1"); 1008 gcc_jit_function_new_block (comp.func, "inline_sub1");
1008 gcc_jit_block *sub1_fcall_block = 1009 gcc_jit_block *sub1_fcall_block =
1009 gcc_jit_function_new_block (comp.func, "fcall-1"); 1010 gcc_jit_function_new_block (comp.func, "fcall_sub1");
1010 1011
1011 gcc_jit_rvalue *tos_as_num = 1012 gcc_jit_rvalue *tos_as_num =
1012 comp_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS)); 1013 comp_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS));
@@ -1057,7 +1058,63 @@ compile_f (const char *f_name, ptrdiff_t bytestr_length,
1057 1058
1058 break; 1059 break;
1059 case Badd1: 1060 case Badd1:
1060 error ("Badd1 unsupported bytecode\n"); 1061 {
1062
1063 /* (FIXNUMP (TOP) && XFIXNUM (TOP) != MOST_POSITIVE_FIXNUM
1064 ? make_fixnum (XFIXNUM (TOP) + 1)
1065 : Fadd (TOP)) */
1066
1067 gcc_jit_block *add1_inline_block =
1068 gcc_jit_function_new_block (comp.func, "inline_add1");
1069 gcc_jit_block *add1_fcall_block =
1070 gcc_jit_function_new_block (comp.func, "fcall_add1");
1071
1072 gcc_jit_rvalue *tos_as_num =
1073 comp_XFIXNUM (gcc_jit_lvalue_as_rvalue (TOS));
1074
1075 comp_emit_cond_jump (
1076 gcc_jit_context_new_binary_op (
1077 comp.ctxt,
1078 NULL,
1079 GCC_JIT_BINARY_OP_LOGICAL_AND,
1080 comp.bool_type,
1081 comp_cast (comp.bool_type,
1082 comp_FIXNUMP (gcc_jit_lvalue_as_rvalue (TOS))),
1083 gcc_jit_context_new_comparison (comp.ctxt,
1084 NULL,
1085 GCC_JIT_COMPARISON_NE,
1086 tos_as_num,
1087 comp.most_positive_fixnum)),
1088 add1_inline_block,
1089 add1_fcall_block);
1090
1091 gcc_jit_rvalue *add1_inline_res =
1092 gcc_jit_context_new_binary_op (comp.ctxt,
1093 NULL,
1094 GCC_JIT_BINARY_OP_PLUS,
1095 comp.long_long_type,
1096 tos_as_num,
1097 comp.one);
1098
1099 gcc_jit_block_add_assignment (add1_inline_block,
1100 NULL,
1101 TOS,
1102 comp_make_fixnum (add1_inline_block,
1103 add1_inline_res));
1104 basic_block_t bb_orig = *comp.bblock;
1105
1106 comp.bblock->gcc_bb = add1_fcall_block;
1107 POP1;
1108 res = comp_emit_call ("Fadd1", comp.lisp_obj_type, 1, args);
1109 PUSH_LVAL (res);
1110
1111 *comp.bblock = bb_orig;
1112
1113 gcc_jit_block_end_with_jump (add1_inline_block, NULL,
1114 bb_map[pc].gcc_bb);
1115 gcc_jit_block_end_with_jump (add1_fcall_block, NULL,
1116 bb_map[pc].gcc_bb);
1117 }
1061 break; 1118 break;
1062 case Beqlsign: 1119 case Beqlsign:
1063 error ("Beqlsign unsupported bytecode\n"); 1120 error ("Beqlsign unsupported bytecode\n");