ext/numo/narray/gen/tmpl_bit/binary.c in numo-narray-0.9.1.4 vs ext/numo/narray/gen/tmpl_bit/binary.c in numo-narray-0.9.1.5
- old
+ new
@@ -19,14 +19,12 @@
LOAD_BIT_STEP(a2, p2, s2, idx2, y);
x = m_<%=name%>(x,y);
STORE_BIT_STEP(a3, p3, s3, idx3, x);
}
} else {
- o1 = p1 % NB;
- o1 -= p3;
- o2 = p2 % NB;
- o2 -= p3;
+ o1 = p1-p3;
+ o2 = p2-p3;
l1 = NB+o1;
r1 = NB-o1;
l2 = NB+o2;
r2 = NB-o2;
if (p3>0 || n<NB) {
@@ -52,26 +50,56 @@
x = m_<%=name%>(x,y);
*(a3++) = x;
}
} 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 = *a2>>o2;
- if (o2<0) y |= *(a2-1)>>l2;
- if (o2>0) y |= *(a2+1)<<r2;
+ if (o2==0) {
+ y = *a2;
+ } else if (o2>0) {
+ y = *a2>>o2 | *(a2+1)<<r2;
+ } else {
+ y = *a2<<-o2 | *(a2-1)>>l2;
+ }
a2++;
x = m_<%=name%>(x,y);
*(a3++) = x;
}
}
if (n>0) {
- x = *a1>>o1;
- if (o1<0) x |= *(a1-1)>>l1;
- y = *a2>>o2;
- if (o2<0) y |= *(a2-1)>>l2;
+ 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;
+ }
+ }
+ if (o2==0) {
+ y = *a2;
+ } else if (o2>0) {
+ y = *a2>>o2;
+ if ((int)n>r2) {
+ y |= *(a2+1)<<r2;
+ }
+ } else {
+ y = *(a2-1)>>l2;
+ if ((int)n>-o2) {
+ y |= *a2<<-o2;
+ }
+ }
x = m_<%=name%>(x,y);
*a3 = (x & SLB(n)) | (*a3 & BALL<<n);
}
}
}