shithub: sl

Download patch

ref: e8bd06e52d79697df2537addcb45849c88edacaa
parent: 538d930befd24d2f826bb4586bd7117d201d2be5
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Feb 27 15:32:07 EST 2025

vm: slightly faster +, - and idiv

--- a/src/flisp.h
+++ b/src/flisp.h
@@ -109,7 +109,7 @@
 #define iscons(x) (tag(x) == TAG_CONS)
 #define issymbol(x) (tag(x) == TAG_SYM)
 #define isfixnum(x) (((x)&3) == TAG_NUM)
-#define bothfixnums(x, y) ((((x)|(y)) & 3) == TAG_NUM)
+#define bothfixnums(x, y) (isfixnum(x) && isfixnum(y))
 #define isvector(x) (tag(x) == TAG_VECTOR)
 #define iscvalue(x) (tag(x) == TAG_CVALUE)
 #define iscprim(x) (tag(x) == TAG_CPRIM)
--- a/src/vm.inc
+++ b/src/vm.inc
@@ -205,6 +205,7 @@
 }
 
 OP(OP_ADD2) {
+	fixnum_t a, b, q;
 	value_t v;
 LABEL(do_add2):
 	*ipd = (uintptr_t)ip;
@@ -214,15 +215,17 @@
 		*ipd = (uintptr_t)ip;
 		v = sp[-1];
 		int64_t i64;
-		sp[-1] = isfixnum(v) ? fixnum_neg(v) : fl_neg(v);
+		b = isfixnum(v) ? fixnum_neg(v) : fl_neg(v);
+	}else{
+		b = sp[-1];
 	}
-	value_t a, b, q;
 	a = sp[-2];
-	b = sp[-1];
-	if(bothfixnums(a, b) && !sadd_overflow(numval(a), numval(b), &q) && fits_fixnum(q))
-		v = fixnum(q);
-	else
+	if(bothfixnums(a, b) && !sadd_overflow(a, b, &q))
+		v = q;
+	else{
+		sp[-1] = b;
 		v = fl_add_any(sp-2, 2);
+	}
 	sp--;
 	sp[-1] = v;
 	NEXT_OP;
@@ -770,15 +773,15 @@
 OP(OP_IDIV) {
 	value_t a = sp[-2];
 	value_t b = sp[-1];
+	if(fl_unlikely(b == 0)){
+		*ipd = (uintptr_t)ip;
+		FL(sp) = sp;
+		divide_by_0_error();
+	}
 	value_t v;
-	if(bothfixnums(a, b)){
-		if(b == 0){
-			*ipd = (uintptr_t)ip;
-			FL(sp) = sp;
-			divide_by_0_error();
-		}
-		v = fixnum(numval(a) / numval(b));
-	}else{
+	if(bothfixnums(a, b))
+		v = fixnum((fixnum_t)a / (fixnum_t)b);
+	else{
 		*ipd = (uintptr_t)ip;
 		v = fl_idiv2(a, b);
 	}