ref: 70c36896d20df1971a65a800acbe3872157a7910
parent: f88e3f0d32f64dee4cf62910427939f45b66e7e2
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Mar 24 18:08:52 EDT 2025
ash: shift negative fixnums as is
--- a/3rd/mp/mpright.c
+++ b/3rd/mp/mpright.c
@@ -28,7 +28,7 @@
d = shift/Dbits;
r = shift - d*Dbits;
l = Dbits - r;
-
+fprintf(stderr, "%u %u %u\n", d, r, l);
// shift all the bits out == zero
if(d>=b->top){
res->sign = 1;
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -1256,11 +1256,13 @@
argcount(nargs, 2);
sl_v a = args[0];
n = tofixnum(args[1]);
+ if(n == 0)
+ return a;
mp = nil;
if(isfixnum(a)){
accum = numval(a);
- if(accum >= 0 && n > -64 && n <= 0)
- return fixnum(numval(a)>>(-n));
+ if(n > -64 && n < 0)
+ return fixnum(accum>>(-n));
if(n < 0 || n >= 64 || sash_overflow_64(accum, n, &accum)){
mp = vtomp(accum, nil);
mpleft(mp, n, mp);
@@ -1268,8 +1270,6 @@
return fits_fixnum(accum) ? fixnum(accum) : return_from_s64(accum);
}
if(iscprim(a)){
- if(n == 0)
- return a;
cp = ptr(a);
ta = cp_numtype(cp);
aptr = cp_data(cp);
@@ -1290,8 +1290,6 @@
else if(ta < T_FLOAT)
return return_from_s64(conv_to_s64(aptr, ta)<<n);
}else if(ismp(a)){
- if(n == 0)
- return a;
aptr = cv_data(ptr(a));
mp = mpnew(0);
mpleft(*(mpint**)aptr, n, mp);
--
⑨