aboutsummaryrefslogtreecommitdiffstats
path: root/src/comp.c
diff options
context:
space:
mode:
authorAndrea Corallo2019-07-11 22:39:42 +0200
committerAndrea Corallo2020-01-01 11:33:52 +0100
commit8f1492c0b7b3ca684b3f88dc709b882cb758aad3 (patch)
tree27f976ca3008d8b6f1a9ab65b24616019946ae1c /src/comp.c
parent6d0d29cae64051e61393be8f1ad1187e218cad40 (diff)
downloademacs-8f1492c0b7b3ca684b3f88dc709b882cb758aad3.tar.gz
emacs-8f1492c0b7b3ca684b3f88dc709b882cb758aad3.zip
simplify limple instruction set
Diffstat (limited to 'src/comp.c')
-rw-r--r--src/comp.c81
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
958static gcc_jit_rvalue * 958static gcc_jit_rvalue *
959retrive_mvar_val (Lisp_Object mvar) 959emit_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);