diff options
| author | Andrea Corallo | 2019-07-11 22:39:42 +0200 |
|---|---|---|
| committer | Andrea Corallo | 2020-01-01 11:33:52 +0100 |
| commit | 8f1492c0b7b3ca684b3f88dc709b882cb758aad3 (patch) | |
| tree | 27f976ca3008d8b6f1a9ab65b24616019946ae1c /src/comp.c | |
| parent | 6d0d29cae64051e61393be8f1ad1187e218cad40 (diff) | |
| download | emacs-8f1492c0b7b3ca684b3f88dc709b882cb758aad3.tar.gz emacs-8f1492c0b7b3ca684b3f88dc709b882cb758aad3.zip | |
simplify limple instruction set
Diffstat (limited to 'src/comp.c')
| -rw-r--r-- | src/comp.c | 81 |
1 files changed, 43 insertions, 38 deletions
diff --git a/src/comp.c b/src/comp.c index 1d6eaf6648e..cbbc5f03782 100644 --- a/src/comp.c +++ b/src/comp.c | |||
| @@ -951,12 +951,12 @@ emit_PURE_P (gcc_jit_rvalue *ptr) | |||
| 951 | /* return emit_call (f_name, comp.lisp_obj_type, 2, args); */ | 951 | /* return emit_call (f_name, comp.lisp_obj_type, 2, args); */ |
| 952 | /* } */ | 952 | /* } */ |
| 953 | 953 | ||
| 954 | /* Retrive an r-value from a meta variable. | 954 | /* Emit an r-value from an mvar meta variable. |
| 955 | In case this is a constant that was propagated return it otherwise load it | 955 | In case this is a constant that was propagated return it otherwise load it |
| 956 | from the frame. */ | 956 | from frame. */ |
| 957 | 957 | ||
| 958 | static gcc_jit_rvalue * | 958 | static gcc_jit_rvalue * |
| 959 | retrive_mvar_val (Lisp_Object mvar) | 959 | emit_mvar_val (Lisp_Object mvar) |
| 960 | { | 960 | { |
| 961 | if (NILP (FUNCALL1 (comp-mvar-const-vld, mvar))) | 961 | if (NILP (FUNCALL1 (comp-mvar-const-vld, mvar))) |
| 962 | return | 962 | return |
| @@ -971,6 +971,7 @@ emit_limple_inst (Lisp_Object inst) | |||
| 971 | { | 971 | { |
| 972 | Lisp_Object op = XCAR (inst); | 972 | Lisp_Object op = XCAR (inst); |
| 973 | Lisp_Object arg0 = SECOND (inst); | 973 | Lisp_Object arg0 = SECOND (inst); |
| 974 | gcc_jit_rvalue *res; | ||
| 974 | 975 | ||
| 975 | if (EQ (op, Qblock)) | 976 | if (EQ (op, Qblock)) |
| 976 | { | 977 | { |
| @@ -984,40 +985,43 @@ emit_limple_inst (Lisp_Object inst) | |||
| 984 | gcc_jit_block_end_with_jump (comp.block, NULL, target); | 985 | gcc_jit_block_end_with_jump (comp.block, NULL, target); |
| 985 | comp.block = target; | 986 | comp.block = target; |
| 986 | } | 987 | } |
| 987 | else if (EQ (op, Qcall_ass)) | 988 | else if (EQ (op, Qset)) |
| 988 | { | 989 | { |
| 989 | /* | ||
| 990 | Ex: (=call #s(comp-mvar 6 1 nil nil nil) | ||
| 991 | (call Fcar #s(comp-mvar 4 0 nil nil nil))) | ||
| 992 | |||
| 993 | Ex: (=call #s(comp-mvar 5 0 nil nil cons) | ||
| 994 | (call Fcons #s(comp-mvar 3 0 t 1 nil) | ||
| 995 | #s(comp-mvar 4 nil t nil nil))) | ||
| 996 | */ | ||
| 997 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); | 990 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); |
| 998 | Lisp_Object arg1 = THIRD (inst); | 991 | Lisp_Object arg1 = THIRD (inst); |
| 999 | 992 | ||
| 1000 | if (FIRST (arg1) == Qcall) | 993 | if (EQ (Ftype_of (arg1), Qcomp_mvar)) |
| 1001 | { | 994 | { |
| 1002 | char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1))); | 995 | /* |
| 996 | Ex: (= #s(comp-mvar 6 2 nil nil nil) | ||
| 997 | #s(comp-mvar 6 0 nil nil nil)). | ||
| 998 | */ | ||
| 999 | res = emit_mvar_val (arg1); | ||
| 1000 | } | ||
| 1001 | else if (EQ (FIRST (arg1), Qcall)) | ||
| 1002 | { | ||
| 1003 | /* | ||
| 1004 | Ex: (= #s(comp-mvar 6 1 nil nil nil) | ||
| 1005 | (call Fcar #s(comp-mvar 4 0 nil nil nil))) | ||
| 1006 | |||
| 1007 | Ex: (= #s(comp-mvar 5 0 nil nil cons) | ||
| 1008 | (call Fcons #s(comp-mvar 3 0 t 1 nil) | ||
| 1009 | #s(comp-mvar 4 nil t nil nil))) | ||
| 1010 | */ | ||
| 1003 | 1011 | ||
| 1012 | char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1))); | ||
| 1004 | Lisp_Object call_args = XCDR (XCDR (arg1)); | 1013 | Lisp_Object call_args = XCDR (XCDR (arg1)); |
| 1005 | ptrdiff_t nargs = list_length (call_args); | 1014 | ptrdiff_t nargs = list_length (call_args); |
| 1006 | gcc_jit_rvalue *gcc_args[nargs]; | 1015 | gcc_jit_rvalue *gcc_args[nargs]; |
| 1007 | int i = 0; | 1016 | int i = 0; |
| 1008 | FOR_EACH_TAIL (call_args) | 1017 | FOR_EACH_TAIL (call_args) |
| 1009 | gcc_args[i++] = retrive_mvar_val (XCAR (call_args)); | 1018 | gcc_args[i++] = emit_mvar_val (XCAR (call_args)); |
| 1010 | gcc_jit_rvalue *res = | 1019 | res = emit_call (calle, comp.lisp_obj_type, nargs, gcc_args); |
| 1011 | emit_call (calle, comp.lisp_obj_type, nargs, gcc_args); | ||
| 1012 | |||
| 1013 | gcc_jit_block_add_assignment (comp.block, | ||
| 1014 | NULL, | ||
| 1015 | comp.frame[slot_n], | ||
| 1016 | res); | ||
| 1017 | } | 1020 | } |
| 1018 | else if ((FIRST (arg1) == Qcallref)) | 1021 | else if (EQ (FIRST (arg1), Qcallref)) |
| 1019 | { | 1022 | { |
| 1020 | /* Ex: (=call #s(comp-mvar 10 1 nil nil nil) (callref Fplus 2 0)). */ | 1023 | /* Ex: (= #s(comp-mvar 10 1 nil nil nil) (callref Fplus 2 0)). */ |
| 1024 | |||
| 1021 | char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1))); | 1025 | char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1))); |
| 1022 | EMACS_UINT nargs = XFIXNUM (THIRD (arg1)); | 1026 | EMACS_UINT nargs = XFIXNUM (THIRD (arg1)); |
| 1023 | EMACS_UINT base_ptr = XFIXNUM (FORTH (arg1)); | 1027 | EMACS_UINT base_ptr = XFIXNUM (FORTH (arg1)); |
| @@ -1028,17 +1032,18 @@ emit_limple_inst (Lisp_Object inst) | |||
| 1028 | gcc_jit_lvalue_get_address ( | 1032 | gcc_jit_lvalue_get_address ( |
| 1029 | comp.frame[base_ptr], | 1033 | comp.frame[base_ptr], |
| 1030 | NULL) }; | 1034 | NULL) }; |
| 1031 | gcc_jit_rvalue *res = | 1035 | res = emit_call (calle, comp.lisp_obj_type, 2, gcc_args); |
| 1032 | emit_call (calle, comp.lisp_obj_type, 2, gcc_args); | ||
| 1033 | gcc_jit_block_add_assignment (comp.block, | ||
| 1034 | NULL, | ||
| 1035 | comp.frame[slot_n], | ||
| 1036 | res); | ||
| 1037 | } | 1036 | } |
| 1038 | else | 1037 | else |
| 1039 | error ("LIMPLE inconsistent arg1 for op =call"); | 1038 | { |
| 1039 | error ("LIMPLE inconsistent arg1 for op ="); | ||
| 1040 | } | ||
| 1041 | gcc_jit_block_add_assignment (comp.block, | ||
| 1042 | NULL, | ||
| 1043 | comp.frame[slot_n], | ||
| 1044 | res); | ||
| 1040 | } | 1045 | } |
| 1041 | else if (EQ (op, Qpar_ass)) | 1046 | else if (EQ (op, Qsetpar)) |
| 1042 | { | 1047 | { |
| 1043 | /* Ex: (=par #s(comp-mvar 2 0 nil nil nil) 0). */ | 1048 | /* Ex: (=par #s(comp-mvar 2 0 nil nil nil) 0). */ |
| 1044 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); | 1049 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); |
| @@ -1051,9 +1056,9 @@ emit_limple_inst (Lisp_Object inst) | |||
| 1051 | comp.frame[slot_n], | 1056 | comp.frame[slot_n], |
| 1052 | param); | 1057 | param); |
| 1053 | } | 1058 | } |
| 1054 | else if (EQ (op, Qconst_ass)) | 1059 | else if (EQ (op, Qsetimm)) |
| 1055 | { | 1060 | { |
| 1056 | /* EX: (=const #s(comp-mvar 9 1 t 3 nil) 3). */ | 1061 | /* EX: (=imm #s(comp-mvar 9 1 t 3 nil) 3). */ |
| 1057 | Lisp_Object arg1 = THIRD (inst); | 1062 | Lisp_Object arg1 = THIRD (inst); |
| 1058 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); | 1063 | EMACS_UINT slot_n = XFIXNUM (FUNCALL1 (comp-mvar-slot, arg0)); |
| 1059 | gcc_jit_block_add_assignment (comp.block, | 1064 | gcc_jit_block_add_assignment (comp.block, |
| @@ -1070,7 +1075,7 @@ emit_limple_inst (Lisp_Object inst) | |||
| 1070 | { | 1075 | { |
| 1071 | gcc_jit_block_end_with_return (comp.block, | 1076 | gcc_jit_block_end_with_return (comp.block, |
| 1072 | NULL, | 1077 | NULL, |
| 1073 | retrive_mvar_val (arg0)); | 1078 | emit_mvar_val (arg0)); |
| 1074 | } | 1079 | } |
| 1075 | } | 1080 | } |
| 1076 | 1081 | ||
| @@ -2054,10 +2059,10 @@ syms_of_comp (void) | |||
| 2054 | DEFSYM (Qcall, "call"); | 2059 | DEFSYM (Qcall, "call"); |
| 2055 | DEFSYM (Qcallref, "callref"); | 2060 | DEFSYM (Qcallref, "callref"); |
| 2056 | DEFSYM (Qncall, "ncall"); | 2061 | DEFSYM (Qncall, "ncall"); |
| 2057 | DEFSYM (Qpar_ass, "=par"); | 2062 | DEFSYM (Qsetpar, "setpar"); |
| 2058 | DEFSYM (Qcall_ass, "=call"); | 2063 | DEFSYM (Qsetimm, "setimm"); |
| 2059 | DEFSYM (Qconst_ass, "=const"); | ||
| 2060 | DEFSYM (Qreturn, "return"); | 2064 | DEFSYM (Qreturn, "return"); |
| 2065 | DEFSYM (Qcomp_mvar, "comp-mvar"); | ||
| 2061 | 2066 | ||
| 2062 | defsubr (&Scomp_init_ctxt); | 2067 | defsubr (&Scomp_init_ctxt); |
| 2063 | defsubr (&Scomp_release_ctxt); | 2068 | defsubr (&Scomp_release_ctxt); |