;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+;;; Commentary:
+;; This code is an attempt to make a Carrera out of a turbocharged VW Bug.
+;; Or, to put it another way to make the pig fly.
+
;;; Code:
(require 'bytecomp)
(comp-push-call `(call Fsymbol_value ,(make-comp-mvar
:const-vld t
:constant (cadr inst)))))
- ;; ('byte-varset
- ;; (comp-emit-call `(call Fsymbol_value ,(cadr inst))))
+ ('byte-varset
+ (comp-emit-call `(call set_internal
+ ,(make-comp-mvar
+ :const-vld t
+ :constant (cadr inst))
+ ,(comp-slot))))
('byte-constant
(comp-push-const (cadr inst)))
('byte-stack-ref
(comp-emit-call `(call Fcar_safe ,(comp-slot))))
('byte-cdr-safe
(comp-emit-call `(call Fcdr_safe ,(comp-slot))))
+ ('byte-length
+ (comp-emit-call `(call Flength ,(comp-slot))))
('byte-list1
(comp-limplify-listn 1))
('byte-list2
return emit_lisp_obj_from_ptr (FUNCALL1 (comp-mvar-constant, mvar));
}
+static gcc_jit_rvalue *
+emit_limple_call (Lisp_Object arg1)
+{
+ char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1)));
+ Lisp_Object call_args = XCDR (XCDR (arg1));
+ int i = 0;
+
+ if (calle[0] == 'F')
+ {
+ /*
+ Ex: (= #s(comp-mvar 6 1 nil nil nil)
+ (call Fcar #s(comp-mvar 4 0 nil nil nil)))
+
+ Ex: (= #s(comp-mvar 5 0 nil nil cons)
+ (call Fcons #s(comp-mvar 3 0 t 1 nil)
+ #s(comp-mvar 4 nil t nil nil)))
+ */
+
+ ptrdiff_t nargs = list_length (call_args);
+ gcc_jit_rvalue *gcc_args[nargs];
+ FOR_EACH_TAIL (call_args)
+ gcc_args[i++] = emit_mvar_val (XCAR (call_args));
+
+ return emit_call (calle, comp.lisp_obj_type, nargs, gcc_args);
+ }
+ else if (!strcmp (calle, "set_internal"))
+ {
+ /*
+ Ex: (set #s(comp-mvar 8 1 nil nil nil)
+ (call set_internal
+ #s(comp-mvar 7 nil t xxx nil)
+ #s(comp-mvar 6 1 t 3 nil)))
+ */
+ /* TODO: Inline the most common case. */
+ eassert (list_length (call_args) == 2);
+ gcc_jit_rvalue *gcc_args[4];
+ FOR_EACH_TAIL (call_args)
+ gcc_args[i++] = emit_mvar_val (XCAR (call_args));
+ gcc_args[2] = emit_lisp_obj_from_ptr (Qnil);
+ gcc_args[3] = gcc_jit_context_new_rvalue_from_int (comp.ctxt,
+ comp.int_type,
+ SET_INTERNAL_SET);
+ gcc_jit_block_add_eval (
+ comp.block,
+ NULL,
+ emit_call ("set_internal", comp.void_type , 4, gcc_args));
+
+ return NULL;
+ }
+ error ("LIMPLE inconsiste call");
+}
+
static void
emit_limple_inst (Lisp_Object inst)
{
}
else if (EQ (FIRST (arg1), Qcall))
{
- /*
- Ex: (= #s(comp-mvar 6 1 nil nil nil)
- (call Fcar #s(comp-mvar 4 0 nil nil nil)))
-
- Ex: (= #s(comp-mvar 5 0 nil nil cons)
- (call Fcons #s(comp-mvar 3 0 t 1 nil)
- #s(comp-mvar 4 nil t nil nil)))
- */
-
- char *calle = (char *) SDATA (SYMBOL_NAME (SECOND (arg1)));
- Lisp_Object call_args = XCDR (XCDR (arg1));
- ptrdiff_t nargs = list_length (call_args);
- gcc_jit_rvalue *gcc_args[nargs];
- int i = 0;
- FOR_EACH_TAIL (call_args)
- gcc_args[i++] = emit_mvar_val (XCAR (call_args));
- res = emit_call (calle, comp.lisp_obj_type, nargs, gcc_args);
+ res = emit_limple_call (arg1);
}
else if (EQ (FIRST (arg1), Qcallref))
{
{
error ("LIMPLE inconsistent arg1 for op =");
}
- gcc_jit_block_add_assignment (comp.block,
- NULL,
- comp.frame[slot_n],
- res);
+ if (res)
+ gcc_jit_block_add_assignment (comp.block,
+ NULL,
+ comp.frame[slot_n],
+ res);
}
else if (EQ (op, Qsetpar))
{
(should (= (comp-tests-cons-car-f) 1))
(should (= (comp-tests-cons-cdr-f 3) 3)))
-;; (ert-deftest comp-tests-varset ()
-;; "Testing varset."
-;; (defun comp-tests-varset-f ()
-;; (setq comp-tests-var1 55))
-;; (native-compile #'comp-tests-varset-f)
+(ert-deftest comp-tests-varset ()
+ "Testing varset."
+ (defun comp-tests-varset-f ()
+ (setq comp-tests-var1 55))
+ (native-compile #'comp-tests-varset-f)
-;; (comp-tests-varset-f)
+ (comp-tests-varset-f)
-;; (should (= comp-tests-var1 55)))
+ (should (= comp-tests-var1 55)))
-;; (ert-deftest comp-tests-length ()
-;; "Testing length."
-;; (defun comp-tests-length-f ()
-;; (length '(1 2 3)))
-;; (native-compile #'comp-tests-length-f)
+(ert-deftest comp-tests-length ()
+ "Testing length."
+ (defun comp-tests-length-f ()
+ (length '(1 2 3)))
+ (native-compile #'comp-tests-length-f)
-;; (should (= (comp-tests-length-f) 3)))
+ (should (= (comp-tests-length-f) 3)))
;; (ert-deftest comp-tests-aref-aset ()
;; "Testing aref and aset."