summaryrefslogtreecommitdiff
path: root/user/libffcall
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-05-11 23:29:12 +0000
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-05-11 23:29:12 +0000
commit357959274975f567bea4548c97719e4f573544f5 (patch)
tree7edcf6503eaadd23a5e0540e778f25afc521e9dd /user/libffcall
parenta5ce3f8309b0f59316fffa7219bd04f726b08ff5 (diff)
downloadpackages-357959274975f567bea4548c97719e4f573544f5.tar.gz
packages-357959274975f567bea4548c97719e4f573544f5.tar.bz2
packages-357959274975f567bea4548c97719e4f573544f5.tar.xz
packages-357959274975f567bea4548c97719e4f573544f5.zip
user/libffcall: Port to 64-bit PowerPC
Diffstat (limited to 'user/libffcall')
-rw-r--r--user/libffcall/APKBUILD7
-rw-r--r--user/libffcall/ppc64.patch1685
2 files changed, 1690 insertions, 2 deletions
diff --git a/user/libffcall/APKBUILD b/user/libffcall/APKBUILD
index a3bdfde1a..48b16a78f 100644
--- a/user/libffcall/APKBUILD
+++ b/user/libffcall/APKBUILD
@@ -12,7 +12,9 @@ license="GPL-2.0+"
depends=""
makedepends=""
subpackages="$pkgname-dev $pkgname-doc"
-source="https://ftp.gnu.org/gnu/libffcall/libffcall-$pkgver.tar.gz"
+source="https://ftp.gnu.org/gnu/libffcall/libffcall-$pkgver.tar.gz
+ ppc64.patch
+ "
build() {
./configure \
@@ -36,4 +38,5 @@ package() {
}
-sha512sums="b9d3ca4c67ab92915a8183d850153e585dcb58ceb2199a104426a7aae363d37017b1226440acd18a2db0cc207e044f71e932857189964261e8eaa6de5cef1731 libffcall-2.2.tar.gz"
+sha512sums="b9d3ca4c67ab92915a8183d850153e585dcb58ceb2199a104426a7aae363d37017b1226440acd18a2db0cc207e044f71e932857189964261e8eaa6de5cef1731 libffcall-2.2.tar.gz
+db7fae1d2f0d95003186671fd89b097b4abf6184d3001e34dd93419640502b9cd5cf32aef4839d6a4208f4aed793c70f9a4367f12adde21372dc131b111238fe ppc64.patch"
diff --git a/user/libffcall/ppc64.patch b/user/libffcall/ppc64.patch
new file mode 100644
index 000000000..74525987b
--- /dev/null
+++ b/user/libffcall/ppc64.patch
@@ -0,0 +1,1685 @@
+--- 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/avcall/avcall-powerpc64-elfv2-linux.S.old 2019-08-25 01:03:04.000000000 +0000
++++ libffcall-2.2/avcall/avcall-powerpc64-elfv2-linux.S 2020-05-11 23:07:17.992574561 +0000
+@@ -1,44 +1,52 @@
+ .file "avcall-powerpc64.c"
+- .machine power4
+ .abiversion 2
+- .section ".toc","aw"
+ .section ".text"
+ .align 2
+ .p2align 4,,15
+ .globl avcall_call
+ .type avcall_call, @function
+ avcall_call:
+-0: addis 2,12,.TOC.-0b@ha
+- addi 2,2,.TOC.-0b@l
++.LFB0:
++ .cfi_startproc
++.LCF0:
++0: addis 2,12,.TOC.-.LCF0@ha
++ addi 2,2,.TOC.-.LCF0@l
+ .localentry avcall_call,.-avcall_call
+ mflr 0
+ std 30,-16(1)
+ std 31,-8(1)
++ .cfi_register 65, 0
++ .cfi_offset 30, -16
++ .cfi_offset 31, -8
+ mr 30,3
+ std 0,16(1)
+- stdu 1,-112(1)
+- ld 3,48(3)
+- ld 9,40(30)
++ stdu 1,-128(1)
++ .cfi_def_cfa_offset 128
++ .cfi_offset 65, 16
+ mr 31,1
++ .cfi_def_cfa_register 31
++ ld 3,48(3)
+ ld 10,0(1)
++ ld 9,-28688(13)
++ std 9,104(31)
++ li 9,0
++ ld 9,40(30)
++ stdu 10,-2048(1)
+ subf 9,3,9
+- stdu 10,-2064(1)
+ sradi 9,9,3
+ cmpwi 7,9,8
+ ble 7,.L6
+- addi 10,9,-9
+- addi 8,1,96
+- addi 9,3,56
+- rldicl 10,10,0,32
+- addi 8,8,-8
+- addi 10,10,8
+- sldi 10,10,3
+- add 10,3,10
++ addi 8,9,-9
++ addi 7,1,96
++ addi 10,3,56
++ rldic 8,8,3,29
++ addi 9,7,-8
++ add 7,7,8
+ .p2align 4,,15
+ .L5:
+- ldu 7,8(9)
+- cmpld 7,10,9
+- stdu 7,8(8)
++ ldu 8,8(10)
++ stdu 8,8(9)
++ cmpld 7,7,9
+ bne 7,.L5
+ .L6:
+ ld 10,64(30)
+@@ -114,191 +122,210 @@
+ ld 2,24(1)
+ lwz 9,24(30)
+ cmplwi 7,9,1
+- beq 7,.L19
++ beq 7,.L20
+ cmpdi 7,9,0
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,2
+- beq 7,.L45
++ beq 7,.L62
+ cmplwi 7,9,3
+- beq 7,.L45
++ beq 7,.L62
+ cmplwi 7,9,4
+- beq 7,.L45
++ beq 7,.L62
+ cmplwi 7,9,5
+- beq 7,.L46
++ beq 7,.L63
+ cmplwi 7,9,6
+- beq 7,.L46
++ beq 7,.L63
+ cmplwi 7,9,7
+- beq 7,.L47
++ beq 7,.L64
+ cmplwi 7,9,8
+- beq 7,.L47
++ beq 7,.L64
+ cmplwi 7,9,9
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,10
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,11
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,12
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,13
+- beq 7,.L52
++ beq 7,.L71
+ cmplwi 7,9,14
+- beq 7,.L53
++ beq 7,.L72
+ cmplwi 7,9,15
+- beq 7,.L50
++ beq 7,.L68
+ cmplwi 7,9,16
+- bne 7,.L19
++ bne 7,.L20
+ lwz 9,0(30)
+- rldicl. 10,9,55,63
+- beq 0,.L19
++ andi. 9,9,0x200
++ beq 0,.L20
+ ld 10,32(30)
+ addi 9,10,-1
+ cmpldi 7,9,15
+- bgt 7,.L19
+- ld 8,16(30)
+- cmpldi 7,10,8
+- rldicl 9,8,0,61
+- rldicr 8,8,0,60
+- add 10,10,9
+- bgt 7,.L35
++ bgt 7,.L20
++ cmpldi 7,10,1
++ ld 9,16(30)
++ rlwinm 8,3,0,0xff
++ beq 7,.L69
++ cmpldi 7,10,2
++ beq 7,.L73
++ cmpldi 7,10,3
++ rldicl 8,3,48,56
++ beq 7,.L74
++ cmpldi 7,10,4
++ beq 7,.L75
++ cmpldi 7,10,5
++ rldicl 8,3,32,56
++ beq 7,.L76
++ cmpldi 7,10,6
++ rldicl 7,3,24,56
++ beq 7,.L77
++ cmpldi 7,10,7
++ rldicl 6,3,16,56
++ beq 7,.L78
++ std 3,0(9)
++ ld 10,32(30)
+ cmpldi 7,10,8
+- bgt 7,.L36
+- slwi 10,10,3
+- li 7,2
+- ld 6,0(8)
+- slwi 9,9,3
+- addi 10,10,-1
+- sld 10,7,10
+- li 7,1
+- sld 7,7,9
+- sld 9,3,9
+- subf 10,7,10
+- xor 9,9,6
+- and 9,10,9
+- xor 9,9,6
+- std 9,0(8)
+-.L19:
+- addi 1,31,112
++ beq 7,.L20
++ cmpldi 7,10,9
++ beq 7,.L79
++ cmpldi 7,10,10
++ beq 7,.L80
++ cmpldi 7,10,11
++ beq 7,.L81
++ cmpldi 7,10,12
++ beq 7,.L82
++ cmpldi 7,10,13
++ beq 7,.L83
++ cmpldi 7,10,14
++ beq 7,.L84
++ cmpldi 7,10,15
++ beq 7,.L85
++ cmpldi 7,10,16
++ bne 7,.L20
++ std 4,8(9)
++ .p2align 4,,15
++.L20:
++ ld 9,104(31)
++ ld 10,-28688(13)
++ xor. 9,9,10
++ li 10,0
+ li 3,0
++ bne 0,.L86
++ addi 1,31,128
++ .cfi_remember_state
++ .cfi_def_cfa 1, 0
+ ld 0,16(1)
+ ld 30,-16(1)
+ ld 31,-8(1)
+ mtlr 0
++ .cfi_restore 65
++ .cfi_restore 31
++ .cfi_restore 30
+ blr
+ .p2align 4,,15
+-.L50:
++.L68:
++ .cfi_restore_state
+ ld 9,16(30)
+ std 3,0(9)
+- addi 1,31,112
+- li 3,0
+- ld 0,16(1)
+- ld 30,-16(1)
+- ld 31,-8(1)
+- mtlr 0
+- blr
++ b .L20
+ .p2align 4,,15
+-.L45:
++.L62:
+ ld 9,16(30)
+ stb 3,0(9)
+- addi 1,31,112
+- li 3,0
+- ld 0,16(1)
+- ld 30,-16(1)
+- ld 31,-8(1)
+- mtlr 0
+- blr
+-.L46:
++ b .L20
++.L63:
+ ld 9,16(30)
+ sth 3,0(9)
+- b .L19
+-.L47:
++ b .L20
++.L64:
+ ld 9,16(30)
+ stw 3,0(9)
+- b .L19
+-.L52:
++ b .L20
++.L71:
+ ld 9,16(30)
+ stfs 1,0(9)
+- b .L19
+-.L53:
++ b .L20
++.L72:
+ ld 9,16(30)
+ stfd 1,0(9)
+- b .L19
+-.L36:
+- rldicl 9,9,0,32
+- slwi 10,10,3
+- ld 11,0(8)
+- ld 4,8(8)
+- li 7,2
+- mulli 6,9,-8
+- addi 10,10,-65
+- slwi 9,9,3
+- sld 10,7,10
+- sld 5,3,9
+- li 7,-1
+- addi 6,6,64
+- addi 10,10,-1
+- sld 7,7,9
+- srad 3,3,6
+- xor 6,5,11
+- xor 9,3,4
+- and 7,7,6
+- and 9,10,9
+- xor 10,7,11
+- xor 9,9,4
+- std 10,0(8)
+- std 9,8(8)
+- b .L19
+-.L35:
+- rldicl 9,9,0,32
+- ld 11,0(8)
+- li 6,-1
+- cmpldi 7,10,16
+- slwi 5,9,3
+- sld 7,3,5
+- sld 6,6,5
+- xor 7,7,11
+- and 7,6,7
+- xor 7,7,11
+- std 7,0(8)
+- ble 7,.L54
+- mulli 9,9,-8
+- ld 11,16(8)
+- slwi 10,10,3
+- li 7,2
+- addi 10,10,-129
+- addi 9,9,64
+- sld 7,7,10
+- srad 6,4,9
+- srad 3,3,9
+- addi 7,7,-1
+- sld 9,4,5
+- xor 10,6,11
+- or 9,3,9
+- and 10,7,10
+- std 9,8(8)
+- xor 10,10,11
+- std 10,16(8)
+- b .L19
+-.L54:
+- mulli 9,9,-4
+- slwi 10,10,3
+- ld 11,8(8)
+- sld 4,4,5
+- addi 10,10,-65
+- li 6,2
+- addi 9,9,32
+- sld 10,6,10
+- srad 3,3,9
+- srad 9,3,9
+- or 7,9,4
+- addi 9,10,-1
+- xor 10,7,11
+- and 9,10,9
+- xor 9,9,11
+- std 9,8(8)
+- b .L19
++ b .L20
++.L86:
++ bl __stack_chk_fail
++ nop
++.L74:
++ sth 3,1(9)
++.L69:
++ stb 8,0(9)
++ b .L20
++.L85:
++ srdi 7,4,32
++ sradi 8,4,24
++ sradi 10,4,16
++ sradi 4,4,8
++ stw 7,8(9)
++ stb 8,12(9)
++ stb 10,13(9)
++ stb 4,14(9)
++ b .L20
++.L76:
++ stw 3,1(9)
++ stb 8,0(9)
++ b .L20
++.L75:
++ stw 3,0(9)
++ b .L20
++.L73:
++ sth 3,0(9)
++ b .L20
++.L84:
++ srdi 8,4,32
++ sradi 10,4,24
++ sradi 4,4,16
++ stw 8,8(9)
++ stb 10,12(9)
++ stb 4,13(9)
++ b .L20
++.L83:
++ srdi 10,4,32
++ sradi 4,4,24
++ stw 10,8(9)
++ stb 4,12(9)
++ b .L20
++.L82:
++ srdi 4,4,32
++ stw 4,8(9)
++ b .L20
++.L81:
++ srdi 10,4,48
++ sradi 4,4,40
++ sth 10,8(9)
++ stb 4,10(9)
++ b .L20
++.L80:
++ srdi 4,4,48
++ sth 4,8(9)
++ b .L20
++.L79:
++ sradi 4,4,56
++ stb 4,8(9)
++ b .L20
++.L78:
++ stw 3,3(9)
++ stb 8,2(9)
++ stb 7,1(9)
++ stb 6,0(9)
++ b .L20
++.L77:
++ stw 3,2(9)
++ stb 8,1(9)
++ stb 7,0(9)
++ b .L20
+ .long 0
+ .byte 0,0,0,1,128,2,0,0
++ .cfi_endproc
++.LFE0:
+ .size avcall_call,.-avcall_call
++ .gnu_attribute 4, 9
+ #if defined __linux__ || defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __DragonFly__
+ .section .note.GNU-stack,"",@progbits
+ #endif
+--- 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 = (__vaword)((unsigned char *) list.raddr)[0];
+ } else
+ if (list.rsize == 2) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8);
++ iret = ((__vaword)((unsigned char *) list.raddr)[1])
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 8);
+ } else
+ if (list.rsize == 3) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
++ iret = ((__vaword)((unsigned char *) list.raddr)[2])
+ | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[2] << 16);
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 16);
+ } else
+ if (list.rsize == 4) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[2] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[3] << 24);
++ iret = ((__vaword)((unsigned char *) list.raddr)[3])
++ | ((__vaword)((unsigned char *) list.raddr)[2] << 8)
++ | ((__vaword)((unsigned char *) list.raddr)[1] << 16)
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 24);
+ } else
+ if (list.rsize == 5) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
++ iret = ((__vaword)((unsigned char *) list.raddr)[4])
++ | ((__vaword)((unsigned char *) list.raddr)[3] << 8)
+ | ((__vaword)((unsigned char *) list.raddr)[2] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[3] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[4] << 32);
++ | ((__vaword)((unsigned char *) list.raddr)[1] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 32);
+ } else
+ if (list.rsize == 6) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[2] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[3] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[4] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[5] << 40);
++ iret = ((__vaword)((unsigned char *) list.raddr)[5])
++ | ((__vaword)((unsigned char *) list.raddr)[4] << 8)
++ | ((__vaword)((unsigned char *) list.raddr)[3] << 16)
++ | ((__vaword)((unsigned char *) list.raddr)[2] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[1] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 40);
+ } else
+ if (list.rsize == 7) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[2] << 16)
++ iret = ((__vaword)((unsigned char *) list.raddr)[6])
++ | ((__vaword)((unsigned char *) list.raddr)[5] << 8)
++ | ((__vaword)((unsigned char *) list.raddr)[4] << 16)
+ | ((__vaword)((unsigned char *) list.raddr)[3] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[4] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[5] << 40)
+- | ((__vaword)((unsigned char *) list.raddr)[6] << 48);
++ | ((__vaword)((unsigned char *) list.raddr)[2] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[1] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 48);
+ } else
+ if (list.rsize >= 8 && list.rsize <= 16) {
+- iret = ((__vaword)((unsigned char *) list.raddr)[0])
+- | ((__vaword)((unsigned char *) list.raddr)[1] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[2] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[3] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[4] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[5] << 40)
+- | ((__vaword)((unsigned char *) list.raddr)[6] << 48)
+- | ((__vaword)((unsigned char *) list.raddr)[7] << 56);
++ iret = ((__vaword)((unsigned char *) list.raddr)[7])
++ | ((__vaword)((unsigned char *) list.raddr)[6] << 8)
++ | ((__vaword)((unsigned char *) list.raddr)[5] << 16)
++ | ((__vaword)((unsigned char *) list.raddr)[4] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[3] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[2] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[1] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[0] << 56);
+ if (list.rsize == 8) {
+ } else
+ if (list.rsize == 9) {
+- iret2 = (__vaword)((unsigned char *) list.raddr)[8];
++ iret2 = (__vaword)((unsigned char *) list.raddr)[8] << 56;
+ } else
+ if (list.rsize == 10) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48);
+ } else
+ if (list.rsize == 11) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40);
+ } else
+ if (list.rsize == 12) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[11] << 24);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[11] << 32);
+ } else
+ if (list.rsize == 13) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[11] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[12] << 32);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[11] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[12] << 24);
+ } else
+ if (list.rsize == 14) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[11] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[12] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[13] << 40);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[11] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[12] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[13] << 16);
+ } else
+ if (list.rsize == 15) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[11] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[12] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[13] << 40)
+- | ((__vaword)((unsigned char *) list.raddr)[14] << 48);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[11] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[12] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[13] << 16)
++ | ((__vaword)((unsigned char *) list.raddr)[14] << 8);
+ } else
+ if (list.rsize == 16) {
+- iret2 = ((__vaword)((unsigned char *) list.raddr)[8])
+- | ((__vaword)((unsigned char *) list.raddr)[9] << 8)
+- | ((__vaword)((unsigned char *) list.raddr)[10] << 16)
+- | ((__vaword)((unsigned char *) list.raddr)[11] << 24)
+- | ((__vaword)((unsigned char *) list.raddr)[12] << 32)
+- | ((__vaword)((unsigned char *) list.raddr)[13] << 40)
+- | ((__vaword)((unsigned char *) list.raddr)[14] << 48)
+- | ((__vaword)((unsigned char *) list.raddr)[15] << 56);
++ iret2 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
++ | ((__vaword)((unsigned char *) list.raddr)[9] << 48)
++ | ((__vaword)((unsigned char *) list.raddr)[10] << 40)
++ | ((__vaword)((unsigned char *) list.raddr)[11] << 32)
++ | ((__vaword)((unsigned char *) list.raddr)[12] << 24)
++ | ((__vaword)((unsigned char *) list.raddr)[13] << 16)
++ | ((__vaword)((unsigned char *) list.raddr)[14] << 8)
++ | ((__vaword)((unsigned char *) list.raddr)[15]);
+ }
+ }
+ #else /* Optimized: fewer conditional jumps, fewer memory accesses */
+--- libffcall-2.2/vacall/vacall-powerpc64-elfv2-linux.S.old 2019-08-25 01:03:06.000000000 +0000
++++ libffcall-2.2/vacall/vacall-powerpc64-elfv2-linux.S 2020-05-11 23:18:00.842212129 +0000
+@@ -1,9 +1,8 @@
+ .file "vacall-powerpc64.c"
+- .machine power4
+ .abiversion 2
+- .section ".toc","aw"
+ .section ".text"
+ .section ".toc","aw"
++ .align 3
+ .LC0:
+ .quad vacall_function
+ .section ".text"
+@@ -12,40 +11,50 @@
+ .globl vacall_receiver
+ .type vacall_receiver, @function
+ vacall_receiver:
+-0: addis 2,12,.TOC.-0b@ha
+- addi 2,2,.TOC.-0b@l
++.LFB0:
++ .cfi_startproc
++.LCF0:
++0: addis 2,12,.TOC.-.LCF0@ha
++ addi 2,2,.TOC.-.LCF0@l
+ .localentry vacall_receiver,.-vacall_receiver
+ mflr 0
+ std 31,-8(1)
++ std 30,-16(1)
+ addis 11,2,.LC0@toc@ha
+- ld 12,.LC0@toc@l(11)
+- li 11,0
+ std 0,16(1)
+ stdu 1,-224(1)
+- mr 31,1
+- ld 0,0(12)
++ .cfi_def_cfa_offset 224
++ .cfi_offset 65, 16
++ .cfi_offset 31, -8
++ .cfi_offset 30, -16
++ li 0,0
++ ld 12,.LC0@toc@l(11)
+ std 2,24(1)
++ mr 31,1
++ .cfi_def_cfa_register 31
++ addi 11,31,256
++ ld 30,-28688(13)
++ std 30,200(31)
++ li 30,0
++ std 6,280(31)
++ ld 6,0(12)
+ std 9,304(31)
+ li 9,0
+ std 3,256(31)
+- addi 3,31,32
+ std 4,264(31)
++ stfd 1,96(31)
+ std 5,272(31)
+- mtctr 0
+- stw 9,32(31)
+- std 6,280(31)
+ std 7,288(31)
+ std 8,296(31)
++ mtctr 6
+ std 10,312(31)
+- stfd 1,96(31)
+- addi 9,31,256
+ stfd 2,104(31)
+ stfd 3,112(31)
+ stfd 4,120(31)
++ mr 12,6
+ stfd 5,128(31)
+- mr 12,0
+- std 9,56(31)
+ stfd 6,136(31)
++ addi 3,31,32
+ stfd 7,144(31)
+ stfd 8,152(31)
+ stfd 9,160(31)
+@@ -53,173 +62,232 @@
+ stfd 11,176(31)
+ stfd 12,184(31)
+ stfd 13,192(31)
+- std 11,64(31)
+- stw 11,72(31)
+- stw 11,88(31)
++ stw 0,32(31)
++ std 11,56(31)
++ std 9,64(31)
++ stw 9,72(31)
++ stw 9,88(31)
+ bctrl
+ ld 2,24(1)
+ lwz 9,72(31)
+ cmpdi 7,9,0
+ beq 7,.L1
+ cmplwi 7,9,1
+- beq 7,.L27
++ beq 7,.L41
+ cmplwi 7,9,2
+- beq 7,.L30
++ beq 7,.L45
+ cmplwi 7,9,3
+- beq 7,.L27
++ beq 7,.L41
+ cmplwi 7,9,4
+- beq 7,.L31
++ beq 7,.L46
+ cmplwi 7,9,5
+- beq 7,.L32
++ beq 7,.L47
+ cmplwi 7,9,6
+- beq 7,.L33
++ beq 7,.L48
+ cmplwi 7,9,7
+- beq 7,.L34
++ beq 7,.L49
+ cmplwi 7,9,8
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,9
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,10
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,11
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,12
+- beq 7,.L35
++ beq 7,.L50
+ cmplwi 7,9,13
+- beq 7,.L36
++ beq 7,.L51
+ cmplwi 7,9,14
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,15
+ bne 7,.L1
+ lwz 9,32(31)
+- rldicl. 10,9,54,63
++ andi. 9,9,0x400
+ beq 0,.L1
+- ld 9,80(31)
+- addi 10,9,-1
+- cmpldi 7,10,15
++ ld 10,80(31)
++ addi 9,10,-1
++ cmpldi 7,9,15
+ bgt 7,.L1
++ cmpldi 7,10,1
+ ld 8,64(31)
+- cmpldi 7,9,8
+- rldicl 10,8,0,61
+- rldicr 8,8,0,60
+- add 9,9,10
+- bgt 7,.L17
+- cmpldi 7,9,8
+- slwi 9,9,3
+- bgt 7,.L18
+- ld 7,0(8)
+- addi 9,9,-1
+- li 8,2
+- slwi 10,10,3
+- sld 9,8,9
+- addi 9,9,-1
+- and 9,9,7
+- srad 3,9,10
++ lbz 9,0(8)
++ beq 7,.L52
++ cmpldi 7,10,2
++ beq 7,.L53
++ cmpldi 7,10,3
++ lbz 7,1(8)
++ lbz 6,2(8)
++ beq 7,.L54
++ cmpldi 7,10,4
++ beq 7,.L55
++ cmpldi 7,10,5
++ beq 7,.L56
++ cmpldi 7,10,6
++ beq 7,.L57
++ cmpldi 7,10,7
++ beq 7,.L58
++ cmpldi 7,10,8
++ ld 3,0(8)
++ beq 7,.L1
++ cmpldi 7,10,9
++ lbz 9,8(8)
++ sldi 9,9,56
++ beq 7,.L59
++ lbz 7,9(8)
++ cmpldi 7,10,10
++ sldi 7,7,48
++ or 7,7,9
++ beq 7,.L60
++ cmpldi 7,10,11
++ lbz 9,10(8)
++ sldi 9,9,40
++ beq 7,.L43
++ cmpldi 7,10,12
++ lbz 6,11(8)
++ sldi 6,6,32
++ beq 7,.L61
++ cmpldi 7,10,13
++ lbz 5,12(8)
++ sldi 5,5,24
++ beq 7,.L62
++ cmpldi 7,10,14
++ lbz 11,13(8)
++ sldi 11,11,16
++ beq 7,.L63
++ cmpldi 7,10,15
++ beq 7,.L64
++ ld 4,8(8)
++ .p2align 4,,15
+ .L1:
++ ld 9,200(31)
++ ld 10,-28688(13)
++ xor. 9,9,10
++ li 10,0
++ bne 0,.L65
+ addi 1,31,224
++ .cfi_remember_state
++ .cfi_def_cfa 1, 0
+ ld 0,16(1)
++ ld 30,-16(1)
+ ld 31,-8(1)
+ mtlr 0
++ .cfi_restore 65
++ .cfi_restore 31
++ .cfi_restore 30
+ blr
+ .p2align 4,,15
+-.L27:
+- addi 1,31,224
++.L41:
++ .cfi_restore_state
+ lbz 3,40(31)
+- ld 0,16(1)
+- ld 31,-8(1)
+- mtlr 0
+- blr
++ b .L1
+ .p2align 4,,15
+-.L30:
+- lbz 9,40(31)
+- extsb 3,9
++.L45:
++ lbz 3,40(31)
++ extsb 3,3
+ b .L1
+ .p2align 4,,15
+-.L28:
+- ld 3,40(31)
++.L48:
++ lwa 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L31:
++.L46:
+ lha 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L32:
++.L47:
+ lhz 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L33:
+- lwa 3,40(31)
+- b .L1
+- .p2align 4,,15
+-.L35:
+- lfs 1,40(31)
++.L42:
++ ld 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L34:
++.L49:
+ lwz 3,40(31)
+ b .L1
+-.L36:
++.L50:
++ lfs 1,40(31)
++ b .L1
++.L51:
+ lfd 1,40(31)
+ b .L1
+-.L17:
+- cmpldi 7,9,16
+- rldicl 10,10,0,32
+- slwi 9,9,3
+- ble 7,.L37
+- li 7,2
+- addi 9,9,-129
+- ld 11,16(8)
+- ld 5,0(8)
+- mulli 6,10,-8
+- sld 9,7,9
+- ld 7,8(8)
+- addi 8,9,-1
+- slwi 9,10,3
+- addi 6,6,64
+- and 10,8,11
+- srad 8,5,9
+- sld 5,7,6
+- srad 9,7,9
+- sld 10,10,6
+- or 3,8,5
+- or 4,10,9
+- b .L1
+-.L18:
+- rldicl 10,10,0,32
+- li 7,2
+- ld 6,8(8)
+- ld 8,0(8)
+- addi 9,9,-65
+- sld 9,7,9
+- mulli 7,10,-8
+- slwi 10,10,3
+- addi 9,9,-1
+- srad 10,8,10
+- and 9,9,6
+- addi 7,7,64
+- sld 9,9,7
+- or 3,9,10
+- b .L1
+-.L37:
+- li 7,2
+- addi 9,9,-65
+- ld 5,8(8)
+- ld 6,0(8)
+- sld 9,7,9
+- mulli 7,10,-4
+- addi 9,9,-1
+- addi 7,7,32
+- and 8,9,5
+- slwi 9,10,3
+- sld 10,8,7
+- srad 6,6,9
+- srad 4,8,9
+- sld 7,10,7
+- or 3,6,7
++.L65:
++ bl __stack_chk_fail
++ nop
++.L64:
++ or 4,9,6
++ lbz 9,14(8)
++ or 4,4,5
++ sldi 9,9,8
++ or 4,4,11
++ or 4,4,9
++ or 4,4,7
++ b .L1
++.L63:
++ or 4,9,6
++ or 4,4,5
++ or 4,4,11
++ or 4,4,7
++ b .L1
++.L55:
++ lwz 3,0(8)
++ b .L1
++.L54:
++ sldi 7,7,8
++ sldi 9,9,16
++ or 9,7,9
++ or 3,9,6
++ b .L1
++.L53:
++ lhz 3,0(8)
++ b .L1
++.L52:
++ mr 3,9
++ b .L1
++.L62:
++ or 9,9,6
++ or 4,9,5
++ or 4,4,7
++ b .L1
++.L61:
++ or 9,9,6
++.L43:
++ or 4,9,7
++ b .L1
++.L60:
++ mr 4,7
++ b .L1
++.L59:
++ mr 4,9
++ b .L1
++.L58:
++ sldi 6,6,32
++ sldi 7,7,40
++ lwz 3,3(8)
++ sldi 9,9,48
++ or 7,6,7
++ or 3,7,3
++ or 3,3,9
++ b .L1
++.L57:
++ sldi 7,7,32
++ sldi 9,9,40
++ lwz 3,2(8)
++ or 9,7,9
++ or 3,9,3
++ b .L1
++.L56:
++ lwz 3,1(8)
++ sldi 9,9,32
++ or 3,3,9
+ b .L1
+ .long 0
+- .byte 0,0,0,1,128,1,0,0
++ .byte 0,0,0,1,128,2,0,0
++ .cfi_endproc
++.LFE0:
+ .size vacall_receiver,.-vacall_receiver
++ .gnu_attribute 4, 9
+ #if defined __linux__ || defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __DragonFly__
+ .section .note.GNU-stack,"",@progbits
+ #endif
+--- libffcall-2.2/callback/vacall_r/vacall-powerpc64-elfv2-linux.S.old 2019-08-25 01:03:08.000000000 +0000
++++ libffcall-2.2/callback/vacall_r/vacall-powerpc64-elfv2-linux.S 2020-05-11 23:26:54.443785997 +0000
+@@ -1,45 +1,56 @@
+ .file "vacall-powerpc64.c"
+- .machine power4
+ .abiversion 2
+- .section ".toc","aw"
+ .section ".text"
+ .align 2
+ .p2align 4,,15
+ .type callback_receiver, @function
+ callback_receiver:
+-0: addis 2,12,.TOC.-0b@ha
+- addi 2,2,.TOC.-0b@l
++.LFB0:
++ .cfi_startproc
++.LCF0:
++0: addis 2,12,.TOC.-.LCF0@ha
++ addi 2,2,.TOC.-.LCF0@l
+ .localentry callback_receiver,.-callback_receiver
+ mflr 0
+- std 30,-16(1)
++ std 28,-32(1)
++ std 29,-24(1)
+ std 31,-8(1)
++ std 30,-16(1)
+ std 0,16(1)
+- stdu 1,-224(1)
+- li 0,0
+- ld 30,0(11)
++ stdu 1,-240(1)
++ .cfi_def_cfa_offset 240
++ .cfi_offset 65, 16
++ .cfi_offset 28, -32
++ .cfi_offset 29, -24
++ .cfi_offset 31, -8
++ .cfi_offset 30, -16
++ li 28,0
++ std 2,24(1)
+ mr 31,1
+- std 3,256(31)
+- std 4,264(31)
+- addi 4,31,32
+- ld 3,8(11)
+- std 9,304(31)
+- mtctr 30
++ .cfi_def_cfa_register 31
++ addi 29,31,272
++ ld 0,-28688(13)
++ std 0,200(31)
++ li 0,0
++ ld 0,0(11)
++ std 9,320(31)
+ li 9,0
+- std 5,272(31)
+- std 6,280(31)
+- std 7,288(31)
+- std 8,296(31)
+- stw 9,32(31)
+- std 10,312(31)
+ stfd 1,96(31)
++ std 3,272(31)
++ std 4,280(31)
++ std 5,288(31)
+ stfd 2,104(31)
+- mr 12,30
+- addi 9,31,256
++ mtctr 0
++ std 6,296(31)
++ std 7,304(31)
++ std 8,312(31)
++ std 10,328(31)
+ stfd 3,112(31)
+ stfd 4,120(31)
+ stfd 5,128(31)
+ stfd 6,136(31)
+- std 9,56(31)
++ mr 12,0
++ addi 4,31,32
+ stfd 7,144(31)
+ stfd 8,152(31)
+ stfd 9,160(31)
+@@ -47,195 +58,266 @@
+ stfd 11,176(31)
+ stfd 12,184(31)
+ stfd 13,192(31)
+- std 0,64(31)
+- stw 0,72(31)
+- stw 0,88(31)
+- std 2,24(1)
++ ld 3,8(11)
++ stw 28,32(31)
++ std 9,64(31)
++ stw 9,72(31)
++ stw 9,88(31)
++ std 29,56(31)
+ bctrl
+ ld 2,24(1)
+ lwz 9,72(31)
+ cmpdi 7,9,0
+ beq 7,.L1
+ cmplwi 7,9,1
+- beq 7,.L27
++ beq 7,.L41
+ cmplwi 7,9,2
+- beq 7,.L30
++ beq 7,.L45
+ cmplwi 7,9,3
+- beq 7,.L27
++ beq 7,.L41
+ cmplwi 7,9,4
+- beq 7,.L31
++ beq 7,.L46
+ cmplwi 7,9,5
+- beq 7,.L32
++ beq 7,.L47
+ cmplwi 7,9,6
+- beq 7,.L33
++ beq 7,.L48
+ cmplwi 7,9,7
+- beq 7,.L34
++ beq 7,.L49
+ cmplwi 7,9,8
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,9
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,10
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,11
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,12
+- beq 7,.L35
++ beq 7,.L50
+ cmplwi 7,9,13
+- beq 7,.L36
++ beq 7,.L51
+ cmplwi 7,9,14
+- beq 7,.L28
++ beq 7,.L42
+ cmplwi 7,9,15
+ bne 7,.L1
+ lwz 9,32(31)
+- rldicl. 10,9,54,63
++ andi. 9,9,0x400
+ beq 0,.L1
+- ld 9,80(31)
+- addi 10,9,-1
+- cmpldi 7,10,15
++ ld 10,80(31)
++ addi 9,10,-1
++ cmpldi 7,9,15
+ bgt 7,.L1
++ cmpldi 7,10,1
+ ld 8,64(31)
+- cmpldi 7,9,8
+- rldicl 10,8,0,61
+- rldicr 8,8,0,60
+- add 9,9,10
+- bgt 7,.L17
+- cmpldi 7,9,8
+- slwi 9,9,3
+- bgt 7,.L18
+- ld 7,0(8)
+- addi 9,9,-1
+- li 8,2
+- slwi 10,10,3
+- sld 9,8,9
+- addi 9,9,-1
+- and 9,9,7
+- srad 3,9,10
++ lbz 9,0(8)
++ beq 7,.L52
++ cmpldi 7,10,2
++ beq 7,.L53
++ cmpldi 7,10,3
++ lbz 7,1(8)
++ lbz 6,2(8)
++ beq 7,.L54
++ cmpldi 7,10,4
++ beq 7,.L55
++ cmpldi 7,10,5
++ beq 7,.L56
++ cmpldi 7,10,6
++ beq 7,.L57
++ cmpldi 7,10,7
++ beq 7,.L58
++ cmpldi 7,10,8
++ ld 3,0(8)
++ beq 7,.L1
++ cmpldi 7,10,9
++ lbz 9,8(8)
++ sldi 9,9,56
++ beq 7,.L59
++ lbz 7,9(8)
++ cmpldi 7,10,10
++ sldi 7,7,48
++ or 7,7,9
++ beq 7,.L60
++ cmpldi 7,10,11
++ lbz 9,10(8)
++ sldi 9,9,40
++ beq 7,.L43
++ cmpldi 7,10,12
++ lbz 6,11(8)
++ sldi 6,6,32
++ beq 7,.L61
++ cmpldi 7,10,13
++ lbz 5,12(8)
++ sldi 5,5,24
++ beq 7,.L62
++ cmpldi 7,10,14
++ lbz 0,13(8)
++ sldi 0,0,16
++ beq 7,.L63
++ cmpldi 7,10,15
++ beq 7,.L64
++ ld 4,8(8)
++ .p2align 4,,15
+ .L1:
+- addi 1,31,224
++ ld 9,200(31)
++ ld 10,-28688(13)
++ xor. 9,9,10
++ li 10,0
++ bne 0,.L65
++ addi 1,31,240
++ .cfi_remember_state
++ .cfi_def_cfa 1, 0
+ ld 0,16(1)
++ ld 28,-32(1)
++ ld 29,-24(1)
+ ld 30,-16(1)
+ ld 31,-8(1)
+ mtlr 0
++ .cfi_restore 65
++ .cfi_restore 31
++ .cfi_restore 30
++ .cfi_restore 29
++ .cfi_restore 28
+ blr
+ .p2align 4,,15
+-.L27:
+- addi 1,31,224
++.L41:
++ .cfi_restore_state
+ lbz 3,40(31)
+- ld 0,16(1)
+- ld 30,-16(1)
+- ld 31,-8(1)
+- mtlr 0
+- blr
++ b .L1
+ .p2align 4,,15
+-.L30:
+- lbz 9,40(31)
+- extsb 3,9
++.L45:
++ lbz 3,40(31)
++ extsb 3,3
+ b .L1
+ .p2align 4,,15
+-.L28:
+- ld 3,40(31)
++.L48:
++ lwa 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L31:
++.L46:
+ lha 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L32:
++.L47:
+ lhz 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L33:
+- lwa 3,40(31)
+- b .L1
+- .p2align 4,,15
+-.L35:
+- lfs 1,40(31)
++.L42:
++ ld 3,40(31)
+ b .L1
+ .p2align 4,,15
+-.L34:
++.L49:
+ lwz 3,40(31)
+ b .L1
+-.L36:
++.L50:
++ lfs 1,40(31)
++ b .L1
++.L51:
+ lfd 1,40(31)
+ b .L1
+-.L17:
+- cmpldi 7,9,16
+- rldicl 10,10,0,32
+- slwi 9,9,3
+- ble 7,.L37
+- li 7,2
+- addi 9,9,-129
+- ld 0,16(8)
+- ld 5,0(8)
+- mulli 6,10,-8
+- sld 9,7,9
+- ld 7,8(8)
+- addi 8,9,-1
+- slwi 9,10,3
+- addi 6,6,64
+- and 10,8,0
+- srad 8,5,9
+- sld 5,7,6
+- srad 9,7,9
+- sld 10,10,6
+- or 3,8,5
+- or 4,10,9
+- b .L1
+-.L18:
+- rldicl 10,10,0,32
+- li 7,2
+- ld 6,8(8)
+- ld 8,0(8)
+- addi 9,9,-65
+- sld 9,7,9
+- mulli 7,10,-8
+- slwi 10,10,3
+- addi 9,9,-1
+- srad 10,8,10
+- and 9,9,6
+- addi 7,7,64
+- sld 9,9,7
+- or 3,9,10
+- b .L1
+-.L37:
+- li 7,2
+- addi 9,9,-65
+- ld 5,8(8)
+- ld 6,0(8)
+- sld 9,7,9
+- mulli 7,10,-4
+- addi 9,9,-1
+- addi 7,7,32
+- and 8,9,5
+- slwi 9,10,3
+- sld 10,8,7
+- srad 6,6,9
+- srad 4,8,9
+- sld 7,10,7
+- or 3,6,7
++.L65:
++ bl __stack_chk_fail
++ nop
++.L64:
++ or 4,9,6
++ lbz 9,14(8)
++ or 4,4,5
++ sldi 9,9,8
++ or 4,4,0
++ or 4,4,9
++ or 4,4,7
++ b .L1
++.L63:
++ or 4,9,6
++ or 4,4,5
++ or 4,4,0
++ or 4,4,7
++ b .L1
++.L55:
++ lwz 3,0(8)
++ b .L1
++.L54:
++ sldi 7,7,8
++ sldi 9,9,16
++ or 9,7,9
++ or 3,9,6
++ b .L1
++.L53:
++ lhz 3,0(8)
++ b .L1
++.L52:
++ mr 3,9
++ b .L1
++.L62:
++ or 9,9,6
++ or 4,9,5
++ or 4,4,7
++ b .L1
++.L61:
++ or 9,9,6
++.L43:
++ or 4,9,7
++ b .L1
++.L60:
++ mr 4,7
++ b .L1
++.L59:
++ mr 4,9
++ b .L1
++.L58:
++ sldi 6,6,32
++ sldi 7,7,40
++ lwz 3,3(8)
++ sldi 9,9,48
++ or 7,6,7
++ or 3,7,3
++ or 3,3,9
++ b .L1
++.L57:
++ sldi 7,7,32
++ sldi 9,9,40
++ lwz 3,2(8)
++ or 9,7,9
++ or 3,9,3
++ b .L1
++.L56:
++ lwz 3,1(8)
++ sldi 9,9,32
++ or 3,3,9
+ b .L1
+ .long 0
+- .byte 0,0,0,1,128,2,0,0
++ .byte 0,0,0,1,128,4,0,0
++ .cfi_endproc
++.LFE0:
+ .size callback_receiver,.-callback_receiver
+ .align 2
+ .p2align 4,,15
+ .globl callback_get_receiver
+ .type callback_get_receiver, @function
+ callback_get_receiver:
+-0: addis 2,12,.TOC.-0b@ha
+- addi 2,2,.TOC.-0b@l
++.LFB1:
++ .cfi_startproc
++.LCF1:
++0: addis 2,12,.TOC.-.LCF1@ha
++ addi 2,2,.TOC.-.LCF1@l
+ .localentry callback_get_receiver,.-callback_get_receiver
+ std 31,-8(1)
+ stdu 1,-48(1)
++ .cfi_def_cfa_offset 48
++ .cfi_offset 31, -8
+ addis 3,2,callback_receiver@toc@ha
+ addi 3,3,callback_receiver@toc@l
+ mr 31,1
++ .cfi_def_cfa_register 31
+ addi 1,31,48
++ .cfi_def_cfa 1, 0
+ ld 31,-8(1)
++ .cfi_restore 31
+ blr
+ .long 0
+ .byte 0,0,0,0,128,1,0,0
++ .cfi_endproc
++.LFE1:
+ .size callback_get_receiver,.-callback_get_receiver
++ .gnu_attribute 4, 9
+ #if defined __linux__ || defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __DragonFly__
+ .section .note.GNU-stack,"",@progbits
+ #endif