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