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);
}