diff options
| author | Andrea Corallo | 2019-06-10 10:34:04 +0200 |
|---|---|---|
| committer | Andrea Corallo | 2020-01-01 11:33:40 +0100 |
| commit | 097f36bc75a6570e64f80451ae4bbe2172d610e0 (patch) | |
| tree | 2ccd7315056c85cb82c446671528f780d09f53c3 /src/comp.c | |
| parent | f867699b23ad012ad71f08f88ecf3e0e8df045da (diff) | |
| download | emacs-097f36bc75a6570e64f80451ae4bbe2172d610e0.tar.gz emacs-097f36bc75a6570e64f80451ae4bbe2172d610e0.zip | |
add Badd1 support
Diffstat (limited to 'src/comp.c')
| -rw-r--r-- | src/comp.c | 63 |
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"); |