ext/numo/narray/gen/tmpl_bit/unary.c in numo-narray-0.9.1.4 vs ext/numo/narray/gen/tmpl_bit/unary.c in numo-narray-0.9.1.5
- old
+ new
@@ -18,12 +18,11 @@
LOAD_BIT_STEP(a1, p1, s1, idx1, x);
y = m_<%=name%>(x);
STORE_BIT_STEP(a3, p3, s3, idx3, y);
}
} else {
- o1 = p1 % NB;
- o1 -= p3;
+ o1 = p1-p3;
l1 = NB+o1;
r1 = NB-o1;
if (p3>0 || n<NB) {
len = NB - p3;
if ((int)n<len) len=n;
@@ -42,20 +41,35 @@
y = m_<%=name%>(x);
*(a3++) = y;
}
} else {
for (; n>=NB; n-=NB) {
- x = *a1>>o1;
- if (o1<0) x |= *(a1-1)>>l1;
- if (o1>0) x |= *(a1+1)<<r1;
+ if (o1==0) {
+ x = *a1;
+ } else if (o1>0) {
+ x = *a1>>o1 | *(a1+1)<<r1;
+ } else {
+ x = *a1<<-o1 | *(a1-1)>>l1;
+ }
a1++;
y = m_<%=name%>(x);
*(a3++) = y;
}
}
if (n>0) {
- x = *a1>>o1;
- if (o1<0) x |= *(a1-1)>>l1;
+ if (o1==0) {
+ x = *a1;
+ } else if (o1>0) {
+ x = *a1>>o1;
+ if ((int)n>r1) {
+ x |= *(a1+1)<<r1;
+ }
+ } else {
+ x = *(a1-1)>>l1;
+ if ((int)n>-o1) {
+ x |= *a1<<-o1;
+ }
+ }
y = m_<%=name%>(x);
*a3 = (y & SLB(n)) | (*a3 & BALL<<n);
}
}
}