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 */