diff --git a/sys/man/2/mp b/sys/man/2/mp index 5223c8a10..678f0eb7f 100644 --- a/sys/man/2/mp +++ b/sys/man/2/mp @@ -127,6 +127,9 @@ void mptrunc(mpint *b, int n, mpint *res) void mpxtend(mpint *b, int n, mpint *res) .PP .B +void mpasr(mpint *b, int n, mpint *res) +.PP +.B void mpmul(mpint *b1, mpint *b2, mpint *prod) .PP .B @@ -584,6 +587,12 @@ Logical operations (treating negative numbers using two's complement): .I mpnot .BR "res = ~b1" . .TP +.I mpasr +.BR "res = b>>shift" +(\fImpasr\fR, unlike +.IR mpright , +uses two's complement). +.TP .I mptrunc truncates .I b diff --git a/sys/src/libmp/port/mplogic.c b/sys/src/libmp/port/mplogic.c index 3dd9be2ab..16de7571b 100644 --- a/sys/src/libmp/port/mplogic.c +++ b/sys/src/libmp/port/mplogic.c @@ -85,7 +85,8 @@ void mpnot(mpint *b, mpint *r) { mpadd(b, mpone, r); - r->sign ^= -2; + if(r->top != 0) + r->sign ^= -2; } void @@ -193,3 +194,15 @@ mpxtend(mpint *b, int n, mpint *r) } mpnorm(r); } + +void +mpasr(mpint *b, int n, mpint *r) +{ + if(b->sign > 0 || n <= 0){ + mpright(b, n, r); + return; + } + mpadd(b, mpone, r); + mpright(r, n, r); + mpsub(r, mpone, r); +}