blob: e7da43899e667ed2222a4ac144fdc599c265e88b (
plain) (
tree)
|
|
Changed from 2.2/2.3 --> 2.4:
* sed -i ppc64.patch -e 's/vaword/varword/g'
* remove all assembly
--- libffcall-2.2/avcall/avcall-powerpc64.c.old 2018-09-17 16:47:43.000000000 +0000
+++ libffcall-2.2/avcall/avcall-powerpc64.c 2020-05-11 23:06:57.534813743 +0000
@@ -181,111 +181,111 @@
/* In the ELFv2 ABI, gcc returns structs of size <= 16 in registers. */
if (l->rsize > 0 && l->rsize <= 16) {
void* raddr = l->raddr;
- #if 0 /* Unoptimized */
+ #if 1 /* Unoptimized */
if (l->rsize == 1) {
((unsigned char *)raddr)[0] = (unsigned char)(iret);
} else
if (l->rsize == 2) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>8);
} else
if (l->rsize == 3) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[2] = (unsigned char)(iret);
((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
- ((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>16);
} else
if (l->rsize == 4) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
- ((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
- ((unsigned char *)raddr)[3] = (unsigned char)(iret>>24);
+ ((unsigned char *)raddr)[3] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[2] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret>>16);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>24);
} else
if (l->rsize == 5) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[4] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[3] = (unsigned char)(iret>>8);
((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
- ((unsigned char *)raddr)[3] = (unsigned char)(iret>>24);
- ((unsigned char *)raddr)[4] = (unsigned char)(iret>>32);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret>>24);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>32);
} else
if (l->rsize == 6) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
- ((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
- ((unsigned char *)raddr)[3] = (unsigned char)(iret>>24);
- ((unsigned char *)raddr)[4] = (unsigned char)(iret>>32);
- ((unsigned char *)raddr)[5] = (unsigned char)(iret>>40);
+ ((unsigned char *)raddr)[5] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[4] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[3] = (unsigned char)(iret>>16);
+ ((unsigned char *)raddr)[2] = (unsigned char)(iret>>24);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret>>32);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>40);
} else
if (l->rsize == 7) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
- ((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
+ ((unsigned char *)raddr)[6] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[5] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[4] = (unsigned char)(iret>>16);
((unsigned char *)raddr)[3] = (unsigned char)(iret>>24);
- ((unsigned char *)raddr)[4] = (unsigned char)(iret>>32);
- ((unsigned char *)raddr)[5] = (unsigned char)(iret>>40);
- ((unsigned char *)raddr)[6] = (unsigned char)(iret>>48);
+ ((unsigned char *)raddr)[2] = (unsigned char)(iret>>32);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret>>40);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>48);
} else
if (l->rsize >= 8 && l->rsize <= 16) {
- ((unsigned char *)raddr)[0] = (unsigned char)(iret);
- ((unsigned char *)raddr)[1] = (unsigned char)(iret>>8);
- ((unsigned char *)raddr)[2] = (unsigned char)(iret>>16);
- ((unsigned char *)raddr)[3] = (unsigned char)(iret>>24);
- ((unsigned char *)raddr)[4] = (unsigned char)(iret>>32);
- ((unsigned char *)raddr)[5] = (unsigned char)(iret>>40);
- ((unsigned char *)raddr)[6] = (unsigned char)(iret>>48);
- ((unsigned char *)raddr)[7] = (unsigned char)(iret>>56);
+ ((unsigned char *)raddr)[7] = (unsigned char)(iret);
+ ((unsigned char *)raddr)[6] = (unsigned char)(iret>>8);
+ ((unsigned char *)raddr)[5] = (unsigned char)(iret>>16);
+ ((unsigned char *)raddr)[4] = (unsigned char)(iret>>24);
+ ((unsigned char *)raddr)[3] = (unsigned char)(iret>>32);
+ ((unsigned char *)raddr)[2] = (unsigned char)(iret>>40);
+ ((unsigned char *)raddr)[1] = (unsigned char)(iret>>48);
+ ((unsigned char *)raddr)[0] = (unsigned char)(iret>>56);
if (l->rsize == 8) {
} else
if (l->rsize == 9) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
} else
if (l->rsize == 10) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
} else
if (l->rsize == 11) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
} else
if (l->rsize == 12) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
- ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>24);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>32);
} else
if (l->rsize == 13) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
- ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>24);
- ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>32);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>32);
+ ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>24);
} else
if (l->rsize == 14) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
- ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>24);
- ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>32);
- ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>32);
+ ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>24);
+ ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>16);
} else
if (l->rsize == 15) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
- ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>24);
- ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>32);
- ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>40);
- ((unsigned char *)raddr)[8+6] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>32);
+ ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>24);
+ ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>16);
+ ((unsigned char *)raddr)[8+6] = (unsigned char)(iret2>>8);
} else
if (l->rsize == 16) {
- ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2);
- ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>8);
- ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>16);
- ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>24);
- ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>32);
- ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>40);
- ((unsigned char *)raddr)[8+6] = (unsigned char)(iret2>>48);
- ((unsigned char *)raddr)[8+7] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+0] = (unsigned char)(iret2>>56);
+ ((unsigned char *)raddr)[8+1] = (unsigned char)(iret2>>48);
+ ((unsigned char *)raddr)[8+2] = (unsigned char)(iret2>>40);
+ ((unsigned char *)raddr)[8+3] = (unsigned char)(iret2>>32);
+ ((unsigned char *)raddr)[8+4] = (unsigned char)(iret2>>24);
+ ((unsigned char *)raddr)[8+5] = (unsigned char)(iret2>>16);
+ ((unsigned char *)raddr)[8+6] = (unsigned char)(iret2>>8);
+ ((unsigned char *)raddr)[8+7] = (unsigned char)(iret2);
}
}
#else /* Optimized: fewer conditional jumps, fewer memory accesses */
--- libffcall-2.2/vacall/vacall-powerpc64.c.old 2020-05-11 23:11:15.566571148 +0000
+++ libffcall-2.2/vacall/vacall-powerpc64.c 2020-05-11 23:16:52.489693582 +0000
@@ -140,111 +140,111 @@
if (list.flags & __VA_REGISTER_STRUCT_RETURN) {
/* In the ELFv2 ABI, gcc returns structs of size <= 16 in registers. */
if (list.rsize > 0 && list.rsize <= 16) {
- #if 0 /* Unoptimized */
+ #if 1 /* Unoptimized */
if (list.rsize == 1) {
iret = (__varword)((unsigned char *) list.raddr)[0];
} else
if (list.rsize == 2) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8);
+ iret = ((__varword)((unsigned char *) list.raddr)[1])
+ | ((__varword)((unsigned char *) list.raddr)[0] << 8);
} else
if (list.rsize == 3) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
+ iret = ((__varword)((unsigned char *) list.raddr)[2])
| ((__varword)((unsigned char *) list.raddr)[1] << 8)
- | ((__varword)((unsigned char *) list.raddr)[2] << 16);
+ | ((__varword)((unsigned char *) list.raddr)[0] << 16);
} else
if (list.rsize == 4) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8)
- | ((__varword)((unsigned char *) list.raddr)[2] << 16)
- | ((__varword)((unsigned char *) list.raddr)[3] << 24);
+ iret = ((__varword)((unsigned char *) list.raddr)[3])
+ | ((__varword)((unsigned char *) list.raddr)[2] << 8)
+ | ((__varword)((unsigned char *) list.raddr)[1] << 16)
+ | ((__varword)((unsigned char *) list.raddr)[0] << 24);
} else
if (list.rsize == 5) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8)
+ iret = ((__varword)((unsigned char *) list.raddr)[4])
+ | ((__varword)((unsigned char *) list.raddr)[3] << 8)
| ((__varword)((unsigned char *) list.raddr)[2] << 16)
- | ((__varword)((unsigned char *) list.raddr)[3] << 24)
- | ((__varword)((unsigned char *) list.raddr)[4] << 32);
+ | ((__varword)((unsigned char *) list.raddr)[1] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[0] << 32);
} else
if (list.rsize == 6) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8)
- | ((__varword)((unsigned char *) list.raddr)[2] << 16)
- | ((__varword)((unsigned char *) list.raddr)[3] << 24)
- | ((__varword)((unsigned char *) list.raddr)[4] << 32)
- | ((__varword)((unsigned char *) list.raddr)[5] << 40);
+ iret = ((__varword)((unsigned char *) list.raddr)[5])
+ | ((__varword)((unsigned char *) list.raddr)[4] << 8)
+ | ((__varword)((unsigned char *) list.raddr)[3] << 16)
+ | ((__varword)((unsigned char *) list.raddr)[2] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[1] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[0] << 40);
} else
if (list.rsize == 7) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8)
- | ((__varword)((unsigned char *) list.raddr)[2] << 16)
+ iret = ((__varword)((unsigned char *) list.raddr)[6])
+ | ((__varword)((unsigned char *) list.raddr)[5] << 8)
+ | ((__varword)((unsigned char *) list.raddr)[4] << 16)
| ((__varword)((unsigned char *) list.raddr)[3] << 24)
- | ((__varword)((unsigned char *) list.raddr)[4] << 32)
- | ((__varword)((unsigned char *) list.raddr)[5] << 40)
- | ((__varword)((unsigned char *) list.raddr)[6] << 48);
+ | ((__varword)((unsigned char *) list.raddr)[2] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[1] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[0] << 48);
} else
if (list.rsize >= 8 && list.rsize <= 16) {
- iret = ((__varword)((unsigned char *) list.raddr)[0])
- | ((__varword)((unsigned char *) list.raddr)[1] << 8)
- | ((__varword)((unsigned char *) list.raddr)[2] << 16)
- | ((__varword)((unsigned char *) list.raddr)[3] << 24)
- | ((__varword)((unsigned char *) list.raddr)[4] << 32)
- | ((__varword)((unsigned char *) list.raddr)[5] << 40)
- | ((__varword)((unsigned char *) list.raddr)[6] << 48)
- | ((__varword)((unsigned char *) list.raddr)[7] << 56);
+ iret = ((__varword)((unsigned char *) list.raddr)[7])
+ | ((__varword)((unsigned char *) list.raddr)[6] << 8)
+ | ((__varword)((unsigned char *) list.raddr)[5] << 16)
+ | ((__varword)((unsigned char *) list.raddr)[4] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[3] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[2] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[1] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[0] << 56);
if (list.rsize == 8) {
} else
if (list.rsize == 9) {
- iret2 = (__varword)((unsigned char *) list.raddr)[8];
+ iret2 = (__varword)((unsigned char *) list.raddr)[8] << 56;
} else
if (list.rsize == 10) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48);
} else
if (list.rsize == 11) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40);
} else
if (list.rsize == 12) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16)
- | ((__varword)((unsigned char *) list.raddr)[11] << 24);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[11] << 32);
} else
if (list.rsize == 13) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16)
- | ((__varword)((unsigned char *) list.raddr)[11] << 24)
- | ((__varword)((unsigned char *) list.raddr)[12] << 32);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[11] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[12] << 24);
} else
if (list.rsize == 14) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16)
- | ((__varword)((unsigned char *) list.raddr)[11] << 24)
- | ((__varword)((unsigned char *) list.raddr)[12] << 32)
- | ((__varword)((unsigned char *) list.raddr)[13] << 40);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[11] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[12] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[13] << 16);
} else
if (list.rsize == 15) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16)
- | ((__varword)((unsigned char *) list.raddr)[11] << 24)
- | ((__varword)((unsigned char *) list.raddr)[12] << 32)
- | ((__varword)((unsigned char *) list.raddr)[13] << 40)
- | ((__varword)((unsigned char *) list.raddr)[14] << 48);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[11] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[12] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[13] << 16)
+ | ((__varword)((unsigned char *) list.raddr)[14] << 8);
} else
if (list.rsize == 16) {
- iret2 = ((__varword)((unsigned char *) list.raddr)[8])
- | ((__varword)((unsigned char *) list.raddr)[9] << 8)
- | ((__varword)((unsigned char *) list.raddr)[10] << 16)
- | ((__varword)((unsigned char *) list.raddr)[11] << 24)
- | ((__varword)((unsigned char *) list.raddr)[12] << 32)
- | ((__varword)((unsigned char *) list.raddr)[13] << 40)
- | ((__varword)((unsigned char *) list.raddr)[14] << 48)
- | ((__varword)((unsigned char *) list.raddr)[15] << 56);
+ iret2 = ((__varword)((unsigned char *) list.raddr)[8] << 56)
+ | ((__varword)((unsigned char *) list.raddr)[9] << 48)
+ | ((__varword)((unsigned char *) list.raddr)[10] << 40)
+ | ((__varword)((unsigned char *) list.raddr)[11] << 32)
+ | ((__varword)((unsigned char *) list.raddr)[12] << 24)
+ | ((__varword)((unsigned char *) list.raddr)[13] << 16)
+ | ((__varword)((unsigned char *) list.raddr)[14] << 8)
+ | ((__varword)((unsigned char *) list.raddr)[15]);
}
}
#else /* Optimized: fewer conditional jumps, fewer memory accesses */
|