Index: .travis.yml ================================================================== --- .travis.yml +++ .travis.yml @@ -223,23 +223,23 @@ env: - config=amigaos # Nintendo 3DS - os: linux - dist: trusty + dist: bionic env: - config=nintendo_3ds # Nintendo DS - os: linux - dist: trusty + dist: bionic env: - config=nintendo_ds # Nintendo Wii - os: linux - dist: trusty + dist: bionic env: - config=wii before_install: - if [ "$TRAVIS_OS_NAME" = "linux" -a -z "$config" ]; then @@ -268,12 +268,14 @@ fi; fi - if [ "$config" = "nintendo_3ds" -o "$config" = "nintendo_ds" -o "$config" = "wii" ]; then - wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb; - sudo dpkg -i devkitpro-pacman.deb; + deb=devkitpro-pacman.amd64.deb; + wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/$deb; + sudo apt install gdebi; + sudo gdebi -n $deb; fi - if [ "$config" = "nintendo_3ds" ]; then sudo dkp-pacman --noconfirm -Syu 3ds-dev; fi Index: src/forwarding/apple-forwarding-i386.S ================================================================== --- src/forwarding/apple-forwarding-i386.S +++ src/forwarding/apple-forwarding-i386.S @@ -15,123 +15,133 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl _of_forward .globl _of_forward_stret .section __TEXT, __cstring, cstring_literals -str_forwardingTargetForSelector_: +Lstr_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __OBJC, __message_refs, literal_pointers, no_dead_strip -sel_forwardingTargetForSelector_: - .long str_forwardingTargetForSelector_ +Lsel_forwardingTargetForSelector_: + .long Lstr_forwardingTargetForSelector_ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions _of_forward: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call get_eip 0: - movl 8(%ebp), %eax - movl %eax, (%esp) + mov eax, [ebp+8] + mov [esp], eax call _object_getClass - movl %eax, (%esp) - movl sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) + mov [esp], eax + .att_syntax /* Next line is broken in Intel syntax */ + movl Lsel_forwardingTargetForSelector_-0b(%ebx), %eax + .intel_syntax noprefix + mov [esp+4], eax call _class_respondsToSelector - testl %eax, %eax + test eax, eax jz 0f - movl 8(%ebp), %eax - movl %eax, (%esp) - movl sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - movl 12(%ebp), %eax - movl %eax, 8(%esp) + mov eax, [ebp+8] + mov [esp], eax + .att_syntax /* Next line is broken in Intel syntax */ + movl Lsel_forwardingTargetForSelector_-0b(%ebx), %eax + .intel_syntax noprefix + mov [esp+4], eax + mov eax, [ebp+12] + mov [esp+8], eax call _objc_msgSend - testl %eax, %eax + test eax, eax jz 0f - cmpl 8(%ebp), %eax + cmp eax, [ebp+8] je 0f - movl %eax, 8(%ebp) + mov [ebp+8], eax - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp jmp _objc_msgSend 0: - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp jmp _of_method_not_found _of_forward_stret: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call get_eip 0: - movl 12(%ebp), %eax - movl %eax, (%esp) + mov eax, [ebp+12] + mov [esp], eax call _object_getClass - movl %eax, (%esp) - movl sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) + mov [esp], eax + .att_syntax /* Next line is broken in Intel syntax */ + movl Lsel_forwardingTargetForSelector_-0b(%ebx), %eax + .intel_syntax noprefix + mov [esp+4], eax call _class_respondsToSelector - testl %eax, %eax + test eax, eax jz 0f - movl 12(%ebp), %eax - movl %eax, (%esp) - movl sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - movl 16(%ebp), %eax - movl %eax, 8(%esp) + mov eax, [ebp+12] + mov [esp], eax + .att_syntax /* Next line is broken in Intel syntax */ + movl Lsel_forwardingTargetForSelector_-0b(%ebx), %eax + .intel_syntax noprefix + mov [esp+4], eax + mov eax, [ebp+16] + mov [esp+8], eax call _objc_msgSend - testl %eax, %eax + test eax, eax jz 0f - cmpl 12(%ebp), %eax + cmp eax, [ebp+12] je 0f - movl %eax, 12(%ebp) + mov [ebp+12], eax - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp jmp _objc_msgSend_stret 0: - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp jmp _of_method_not_found_stret get_eip: - movl (%esp), %ebx + mov ebx, [esp] ret Index: src/forwarding/apple-forwarding-x86_64.S ================================================================== --- src/forwarding/apple-forwarding-x86_64.S +++ src/forwarding/apple-forwarding-x86_64.S @@ -15,10 +15,12 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl _of_forward .globl _of_forward_stret .section __TEXT, __objc_methname, cstring_literals str_forwardingTargetForSelector_: @@ -31,150 +33,150 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions _of_forward: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0xC0, %rsp /* 16-byte alignment */ - movq %rax, -0x8(%rbp) - movq %rdi, -0x10(%rbp) - movq %rsi, -0x18(%rbp) - movq %rdx, -0x20(%rbp) - movq %rcx, -0x28(%rbp) - movq %r8, -0x30(%rbp) - movq %r9, -0x38(%rbp) - movaps %xmm0, -0x50(%rbp) - movaps %xmm1, -0x60(%rbp) - movaps %xmm2, -0x70(%rbp) - movaps %xmm3, -0x80(%rbp) - movaps %xmm4, -0x90(%rbp) - movaps %xmm5, -0xA0(%rbp) - movaps %xmm6, -0xB0(%rbp) - movaps %xmm7, -0xC0(%rbp) + sub rsp, 0xC0 /* 16-byte alignment */ + mov [rbp-0x08], rax + mov [rbp-0x10], rdi + mov [rbp-0x18], rsi + mov [rbp-0x20], rdx + mov [rbp-0x28], rcx + mov [rbp-0x30], r8 + mov [rbp-0x38], r9 + movaps [rbp-0x50], xmm0 + movaps [rbp-0x60], xmm1 + movaps [rbp-0x70], xmm2 + movaps [rbp-0x80], xmm3 + movaps [rbp-0x90], xmm4 + movaps [rbp-0xA0], xmm5 + movaps [rbp-0xB0], xmm6 + movaps [rbp-0xC0], xmm7 call _object_getClass - movq %rax, %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + mov rsi, [rip+sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x10(%rbp), %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x18(%rbp), %rdx + mov rdi, [rbp-0x10] + mov rsi, [rip+sel_forwardingTargetForSelector_] + mov rdx, [rbp-0x18] call _objc_msgSend - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x10(%rbp), %rax + cmp rax, [rbp-0x10] je 0f - movq %rax, %rdi + mov rdi, rax /* Restore all arguments, except %rdi */ - movaps -0xC0(%rbp), %xmm7 - movaps -0xB0(%rbp), %xmm6 - movaps -0xA0(%rbp), %xmm5 - movaps -0x90(%rbp), %xmm4 - movaps -0x80(%rbp), %xmm3 - movaps -0x70(%rbp), %xmm2 - movaps -0x60(%rbp), %xmm1 - movaps -0x50(%rbp), %xmm0 - movq -0x38(%rbp), %r9 - movq -0x30(%rbp), %r8 - movq -0x28(%rbp), %rcx - movq -0x20(%rbp), %rdx - movq -0x18(%rbp), %rsi - movq -0x8(%rbp), %rax - - movq %rbp, %rsp - popq %rbp + movaps xmm7, [rbp-0xC0] + movaps xmm6, [rbp-0xB0] + movaps xmm5, [rbp-0xA0] + movaps xmm4, [rbp-0x90] + movaps xmm3, [rbp-0x80] + movaps xmm2, [rbp-0x70] + movaps xmm1, [rbp-0x60] + movaps xmm0, [rbp-0x50] + mov r9, [rbp-0x38] + mov r8, [rbp-0x30] + mov rcx, [rbp-0x28] + mov rdx, [rbp-0x20] + mov rsi, [rbp-0x18] + mov rax, [rbp-0x08] + + mov rsp, rbp + pop rbp jmp _objc_msgSend 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi + mov rdi, [rbp-0x10] + mov rsi, [rbp-0x18] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _of_method_not_found _of_forward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0xC0, %rsp /* 16-byte alignment */ - movq %rax, -0x8(%rbp) - movq %rdi, -0x10(%rbp) - movq %rsi, -0x18(%rbp) - movq %rdx, -0x20(%rbp) - movq %rcx, -0x28(%rbp) - movq %r8, -0x30(%rbp) - movq %r9, -0x38(%rbp) - movaps %xmm0, -0x50(%rbp) - movaps %xmm1, -0x60(%rbp) - movaps %xmm2, -0x70(%rbp) - movaps %xmm3, -0x80(%rbp) - movaps %xmm4, -0x90(%rbp) - movaps %xmm5, -0xA0(%rbp) - movaps %xmm6, -0xB0(%rbp) - movaps %xmm7, -0xC0(%rbp) - - movq %rsi, %rdi + sub rsp, 0xC0 /* 16-byte alignment */ + mov [rbp-0x08], rax + mov [rbp-0x10], rdi + mov [rbp-0x18], rsi + mov [rbp-0x20], rdx + mov [rbp-0x28], rcx + mov [rbp-0x30], r8 + mov [rbp-0x38], r9 + movaps [rbp-0x50], xmm0 + movaps [rbp-0x60], xmm1 + movaps [rbp-0x70], xmm2 + movaps [rbp-0x80], xmm3 + movaps [rbp-0x90], xmm4 + movaps [rbp-0xA0], xmm5 + movaps [rbp-0xB0], xmm6 + movaps [rbp-0xC0], xmm7 + + mov rdi, rsi call _object_getClass - movq %rax, %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + mov rsi, [rip+sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x18(%rbp), %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp-0x18] + mov rsi, [rip+sel_forwardingTargetForSelector_] + mov rdx, [rbp-0x20] call _objc_msgSend - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x18(%rbp), %rax + cmp rax, [rbp-0x18] je 0f - movq %rax, %rsi + mov rsi, rax /* Restore all arguments, except %rsi */ - movaps -0xC0(%rbp), %xmm7 - movaps -0xB0(%rbp), %xmm6 - movaps -0xA0(%rbp), %xmm5 - movaps -0x90(%rbp), %xmm4 - movaps -0x80(%rbp), %xmm3 - movaps -0x70(%rbp), %xmm2 - movaps -0x60(%rbp), %xmm1 - movaps -0x50(%rbp), %xmm0 - movq -0x38(%rbp), %r9 - movq -0x30(%rbp), %r8 - movq -0x28(%rbp), %rcx - movq -0x20(%rbp), %rdx - movq -0x10(%rbp), %rdi - movq -0x8(%rbp), %rax - - movq %rbp, %rsp - popq %rbp + movaps xmm7, [rbp-0xC0] + movaps xmm6, [rbp-0xB0] + movaps xmm5, [rbp-0xA0] + movaps xmm4, [rbp-0x90] + movaps xmm3, [rbp-0x80] + movaps xmm2, [rbp-0x70] + movaps xmm1, [rbp-0x60] + movaps xmm0, [rbp-0x50] + mov r9, [rbp-0x38] + mov r8, [rbp-0x30] + mov rcx, [rbp-0x28] + mov rdx, [rbp-0x20] + mov rdi, [rbp-0x10] + mov rax, [rbp-0x08] + + mov rsp, rbp + pop rbp jmp _objc_msgSend_stret 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp-0x10] + mov rsi, [rbp-0x18] + mov rdx, [rbp-0x20] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _of_method_not_found_stret Index: src/forwarding/forwarding-x86_64-macho.S ================================================================== --- src/forwarding/forwarding-x86_64-macho.S +++ src/forwarding/forwarding-x86_64-macho.S @@ -17,184 +17,186 @@ #include "config.h" #include "platform.h" +.intel_syntax noprefix + .globl _of_forward .globl _of_forward_stret .section __TEXT, __text, regular, pure_instructions _of_forward: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0xC0, %rsp /* 16-byte alignment */ - movq %rax, -0x8(%rbp) - movq %rdi, -0x10(%rbp) - movq %rsi, -0x18(%rbp) - movq %rdx, -0x20(%rbp) - movq %rcx, -0x28(%rbp) - movq %r8, -0x30(%rbp) - movq %r9, -0x38(%rbp) - movaps %xmm0, -0x50(%rbp) - movaps %xmm1, -0x60(%rbp) - movaps %xmm2, -0x70(%rbp) - movaps %xmm3, -0x80(%rbp) - movaps %xmm4, -0x90(%rbp) - movaps %xmm5, -0xA0(%rbp) - movaps %xmm6, -0xB0(%rbp) - movaps %xmm7, -0xC0(%rbp) + sub rsp, 0xC0 /* 16-byte alignment */ + mov [rbp-0x08], rax + mov [rbp-0x10], rdi + mov [rbp-0x18], rsi + mov [rbp-0x20], rdx + mov [rbp-0x28], rcx + mov [rbp-0x30], r8 + mov [rbp-0x38], r9 + movaps [rbp-0x50], xmm0 + movaps [rbp-0x60], xmm1 + movaps [rbp-0x70], xmm2 + movaps [rbp-0x80], xmm3 + movaps [rbp-0x90], xmm4 + movaps [rbp-0xA0], xmm5 + movaps [rbp-0xB0], xmm6 + movaps [rbp-0xC0], xmm7 call _object_getClass - movq %rax, %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + lea rsi, [rip+sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x10(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, [rbp-0x10] + lea rsi, [rip+sel_forwardingTargetForSelector_] call _objc_msg_lookup - movq -0x10(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x18(%rbp), %rdx - call *%rax + mov rdi, [rbp-0x10] + lea rsi, [rip+sel_forwardingTargetForSelector_] + mov rdx, [rbp-0x18] + call rax - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x10(%rbp), %rax + cmp rax, [rbp-0x10] je 0f - movq %rax, -0x10(%rbp) + mov [rbp-0x10], rax - movq %rax, %rdi - movq -0x18(%rbp), %rsi + mov rdi, rax + mov rsi, [rbp-0x18] call _objc_msg_lookup - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - movaps -0xC0(%rbp), %xmm7 - movaps -0xB0(%rbp), %xmm6 - movaps -0xA0(%rbp), %xmm5 - movaps -0x90(%rbp), %xmm4 - movaps -0x80(%rbp), %xmm3 - movaps -0x70(%rbp), %xmm2 - movaps -0x60(%rbp), %xmm1 - movaps -0x50(%rbp), %xmm0 - movq -0x38(%rbp), %r9 - movq -0x30(%rbp), %r8 - movq -0x28(%rbp), %rcx - movq -0x20(%rbp), %rdx - movq -0x18(%rbp), %rsi - movq -0x10(%rbp), %rdi - movq -0x8(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm7, [rbp-0xC0] + movaps xmm6, [rbp-0xB0] + movaps xmm5, [rbp-0xA0] + movaps xmm4, [rbp-0x90] + movaps xmm3, [rbp-0x80] + movaps xmm2, [rbp-0x70] + movaps xmm1, [rbp-0x60] + movaps xmm0, [rbp-0x50] + mov r9, [rbp-0x38] + mov r8, [rbp-0x30] + mov rcx, [rbp-0x28] + mov rdx, [rbp-0x20] + mov rsi, [rbp-0x18] + mov rdi, [rbp-0x10] + mov rax, [rbp-0x08] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi + mov rdi, [rbp-0x10] + mov rsi, [rbp-0x18] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _of_method_not_found _of_forward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0xC0, %rsp /* 16-byte alignment */ - movq %rax, -0x8(%rbp) - movq %rdi, -0x10(%rbp) - movq %rsi, -0x18(%rbp) - movq %rdx, -0x20(%rbp) - movq %rcx, -0x28(%rbp) - movq %r8, -0x30(%rbp) - movq %r9, -0x38(%rbp) - movaps %xmm0, -0x50(%rbp) - movaps %xmm1, -0x60(%rbp) - movaps %xmm2, -0x70(%rbp) - movaps %xmm3, -0x80(%rbp) - movaps %xmm4, -0x90(%rbp) - movaps %xmm5, -0xA0(%rbp) - movaps %xmm6, -0xB0(%rbp) - movaps %xmm7, -0xC0(%rbp) - - movq %rsi, %rdi + sub rsp, 0xC0 /* 16-byte alignment */ + mov [rbp-0x08], rax + mov [rbp-0x10], rdi + mov [rbp-0x18], rsi + mov [rbp-0x20], rdx + mov [rbp-0x28], rcx + mov [rbp-0x30], r8 + mov [rbp-0x38], r9 + movaps [rbp-0x50], xmm0 + movaps [rbp-0x60], xmm1 + movaps [rbp-0x70], xmm2 + movaps [rbp-0x80], xmm3 + movaps [rbp-0x90], xmm4 + movaps [rbp-0xA0], xmm5 + movaps [rbp-0xB0], xmm6 + movaps [rbp-0xC0], xmm7 + + mov rdi, rsi call _object_getClass - movq %rax, %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + lea rsi, [rip+sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x18(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, [rbp-0x18] + lea rsi, [rip+sel_forwardingTargetForSelector_] call _objc_msg_lookup - movq -0x18(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x20(%rbp), %rdx - call *%rax + mov rdi, [rbp-0x18] + lea rsi, [rip+sel_forwardingTargetForSelector_] + mov rdx, [rbp-0x20] + call rax - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x18(%rbp), %rax + cmp rax, [rbp-0x18] je 0f - movq %rax, -0x18(%rbp) + mov [rbp-0x18], rax - movq %rax, %rdi - movq -0x20(%rbp), %rsi + mov rdi, rax + mov rsi, [rbp-0x20] call _objc_msg_lookup_stret - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - movaps -0xC0(%rbp), %xmm7 - movaps -0xB0(%rbp), %xmm6 - movaps -0xA0(%rbp), %xmm5 - movaps -0x90(%rbp), %xmm4 - movaps -0x80(%rbp), %xmm3 - movaps -0x70(%rbp), %xmm2 - movaps -0x60(%rbp), %xmm1 - movaps -0x50(%rbp), %xmm0 - movq -0x38(%rbp), %r9 - movq -0x30(%rbp), %r8 - movq -0x28(%rbp), %rcx - movq -0x20(%rbp), %rdx - movq -0x18(%rbp), %rsi - movq -0x10(%rbp), %rdi - movq -0x8(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm7, [rbp-0xC0] + movaps xmm6, [rbp-0xB0] + movaps xmm5, [rbp-0xA0] + movaps xmm4, [rbp-0x90] + movaps xmm3, [rbp-0x80] + movaps xmm2, [rbp-0x70] + movaps xmm1, [rbp-0x60] + movaps xmm0, [rbp-0x50] + mov r9, [rbp-0x38] + mov r8, [rbp-0x30] + mov rcx, [rbp-0x28] + mov rdx, [rbp-0x20] + mov rsi, [rbp-0x18] + mov rdi, [rbp-0x10] + mov rax, [rbp-0x08] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp-0x10] + mov rsi, [rbp-0x18] + mov rdx, [rbp-0x20] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _of_method_not_found_stret init: - leaq module(%rip), %rdi + lea rdi, [rip+module] jmp ___objc_exec_class .section __DATA, __mod_init_func, mod_init_funcs .quad init Index: src/invocation/apple-call-x86_64.S ================================================================== --- src/invocation/apple-call-x86_64.S +++ src/invocation/apple-call-x86_64.S @@ -16,103 +16,105 @@ */ #include "config.h" #include "invoke-x86_64.h" + +.intel_syntax noprefix .globl _of_invocation_call .section __TEXT, __text, regular, pure_instructions _of_invocation_call: - pushq %rbp - movq %rsp, %rbp - - subq $16, %rsp - andq $-16, %rsp - movq %rdi, -8(%rbp) - - leaq OFFSET_STACK(%rdi), %rdx - movq OFFSET_STACK_SIZE(%rdi), %rcx - - testq $1, %rcx + push rbp + mov rbp, rsp + + sub rsp, 16 + and rsp, -16 + mov [rbp-8], rdi + + lea rdx, [rdi+OFFSET_STACK] + mov rcx, [rdi+OFFSET_STACK_SIZE] + + test rcx, 1 jnz Lfix_align Lfill_stack: - testq %rcx, %rcx + test rcx, rcx jz Lstack_filled - decq %rcx - movq (%rdx,%rcx,8), %r11 - pushq %r11 + dec rcx + mov r11, [rdx+rcx*8] + push r11 jmp Lfill_stack Lstack_filled: - movb OFFSET_NUM_SSE_USED(%rdi), %al - - movaps OFFSET_SSE_INOUT+112(%rdi), %xmm7 - movaps OFFSET_SSE_INOUT+96(%rdi), %xmm6 - movaps OFFSET_SSE_INOUT+80(%rdi), %xmm5 - movaps OFFSET_SSE_INOUT+64(%rdi), %xmm4 - movaps OFFSET_SSE_INOUT+48(%rdi), %xmm3 - movaps OFFSET_SSE_INOUT+32(%rdi), %xmm2 - movaps OFFSET_SSE_INOUT+16(%rdi), %xmm1 - movaps OFFSET_SSE_INOUT(%rdi), %xmm0 - - movq OFFSET_GPR_IN+40(%rdi), %r9 - movq OFFSET_GPR_IN+32(%rdi), %r8 - movq OFFSET_GPR_IN+24(%rdi), %rcx - movq OFFSET_GPR_IN+16(%rdi), %rdx - movq OFFSET_GPR_IN+8(%rdi), %rsi - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - movq OFFSET_GPR_IN(%rdi), %rdi - - cmpb $RETURN_TYPE_STRET, %r11b + mov al, [rdi+OFFSET_NUM_SSE_USED] + + movaps xmm7, [rdi+OFFSET_SSE_INOUT+112] + movaps xmm6, [rdi+OFFSET_SSE_INOUT+96] + movaps xmm5, [rdi+OFFSET_SSE_INOUT+80] + movaps xmm4, [rdi+OFFSET_SSE_INOUT+64] + movaps xmm3, [rdi+OFFSET_SSE_INOUT+48] + movaps xmm2, [rdi+OFFSET_SSE_INOUT+32] + movaps xmm1, [rdi+OFFSET_SSE_INOUT+16] + movaps xmm0, [rdi+OFFSET_SSE_INOUT] + + mov r9, [rdi+OFFSET_GPR_IN+40] + mov r8, [rdi+OFFSET_GPR_IN+32] + mov rcx, [rdi+OFFSET_GPR_IN+24] + mov rdx, [rdi+OFFSET_GPR_IN+16] + mov rsi, [rdi+OFFSET_GPR_IN+8] + + mov r11b, [rdi+OFFSET_RETURN_TYPE] + mov rdi, [rdi+OFFSET_GPR_IN] + + cmp r11b, RETURN_TYPE_STRET je Lcall_send_stret - cmpb $RETURN_TYPE_JMP, %r11b + cmp r11b, RETURN_TYPE_JMP je _objc_msgSend - cmpb $RETURN_TYPE_JMP_STRET, %r11b + cmp r11b, RETURN_TYPE_JMP_STRET je _objc_msgSend_stret call _objc_msgSend Lafter_send: - movq -8(%rbp), %rdi - movq %rax, OFFSET_GPR_OUT(%rdi) - movq %rdx, OFFSET_GPR_OUT+8(%rdi) - movaps %xmm0, OFFSET_SSE_INOUT(%rdi) - movaps %xmm1, OFFSET_SSE_INOUT+16(%rdi) - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - - cmpb $RETURN_TYPE_X87, %r11b + mov rdi, [rbp-8] + mov [rdi+OFFSET_GPR_OUT], rax + mov [rdi+OFFSET_GPR_OUT+8], rdx + movaps [rdi+OFFSET_SSE_INOUT], xmm0 + movaps [rdi+OFFSET_SSE_INOUT+16], xmm1 + + mov r11b, [rdi+OFFSET_RETURN_TYPE] + + cmp r11b, RETURN_TYPE_X87 je Lpop_long_double - cmpb $RETURN_TYPE_COMPLEX_X87, %r11b + cmp r11b, RETURN_TYPE_COMPLEX_X87 je Lpop_complex_long_double Lreturn: - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp ret Lfix_align: - xorq %r11, %r11 - pushq %r11 + xor r11, r11 + push r11 jmp Lfill_stack Lcall_send_stret: call _objc_msgSend_stret jmp Lafter_send Lpop_long_double: - fstpt OFFSET_X87_OUT(%rdi) + fstp tbyte ptr [rdi+OFFSET_X87_OUT] jmp Lreturn Lpop_complex_long_double: - fstpt OFFSET_X87_OUT(%rdi) - fstpt OFFSET_X87_OUT+16(%rdi) + fstp tbyte ptr [rdi+OFFSET_X87_OUT] + fstp tbyte ptr [rdi+OFFSET_X87_OUT+16] jmp Lreturn Index: src/invocation/call-x86_64-elf.S ================================================================== --- src/invocation/call-x86_64-elf.S +++ src/invocation/call-x86_64-elf.S @@ -16,125 +16,127 @@ */ #include "config.h" #include "invoke-x86_64.h" + +.intel_syntax noprefix .globl of_invocation_call .section .text of_invocation_call: - pushq %rbp - movq %rsp, %rbp - - subq $16, %rsp - andq $-16, %rsp - movq %rdi, -8(%rbp) - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - cmpb $RETURN_TYPE_STRET, %r11b - je .lookup_stret - cmpb $RETURN_TYPE_JMP_STRET, %r11b - je .lookup_stret - - movq OFFSET_GPR_IN+8(%rdi), %rsi - movq OFFSET_GPR_IN+0(%rdi), %rdi + pushq rbp + mov rbp, rsp + + sub rsp, 16 + and rsp, -16 + mov [rbp-8], rdi + + mov r11b, [rdi+OFFSET_RETURN_TYPE] + cmp r11b, RETURN_TYPE_STRET + je short .Llookup_stret + cmp r11b, RETURN_TYPE_JMP_STRET + je short .Llookup_stret + + mov rsi, [rdi+OFFSET_GPR_IN+8] + mov rdi, [rdi+OFFSET_GPR_IN] call objc_msg_lookup@PLT -.after_lookup: - movq %rax, -16(%rbp) - movq -8(%rbp), %rdi - - leaq OFFSET_STACK(%rdi), %rdx - movq OFFSET_STACK_SIZE(%rdi), %rcx - - testq $1, %rcx - jnz .fix_align - -.fill_stack: - testq %rcx, %rcx - jz .stack_filled - - decq %rcx - movq (%rdx,%rcx,8), %r11 - pushq %r11 - - jmp .fill_stack - -.stack_filled: - movb OFFSET_NUM_SSE_USED(%rdi), %al - - movaps OFFSET_SSE_INOUT+112(%rdi), %xmm7 - movaps OFFSET_SSE_INOUT+96(%rdi), %xmm6 - movaps OFFSET_SSE_INOUT+80(%rdi), %xmm5 - movaps OFFSET_SSE_INOUT+64(%rdi), %xmm4 - movaps OFFSET_SSE_INOUT+48(%rdi), %xmm3 - movaps OFFSET_SSE_INOUT+32(%rdi), %xmm2 - movaps OFFSET_SSE_INOUT+16(%rdi), %xmm1 - movaps OFFSET_SSE_INOUT(%rdi), %xmm0 - - movq OFFSET_GPR_IN+40(%rdi), %r9 - movq OFFSET_GPR_IN+32(%rdi), %r8 - movq OFFSET_GPR_IN+24(%rdi), %rcx - movq OFFSET_GPR_IN+16(%rdi), %rdx - movq OFFSET_GPR_IN+8(%rdi), %rsi - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - movq OFFSET_GPR_IN(%rdi), %rdi - - cmpb $RETURN_TYPE_JMP, %r11b - je .jmp_into_method - cmpb $RETURN_TYPE_JMP_STRET, %r11b - je .jmp_into_method - - movq -16(%rbp), %r11 - call *%r11 - -.after_send: - movq -8(%rbp), %rdi - movq %rax, OFFSET_GPR_OUT(%rdi) - movq %rdx, OFFSET_GPR_OUT+8(%rdi) - movaps %xmm0, OFFSET_SSE_INOUT(%rdi) - movaps %xmm1, OFFSET_SSE_INOUT+16(%rdi) - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - - cmpb $RETURN_TYPE_X87, %r11b - je .pop_long_double - - cmpb $RETURN_TYPE_COMPLEX_X87, %r11b - je .pop_complex_long_double - -.return: - movq %rbp, %rsp - popq %rbp +.Lafter_lookup: + mov [rbp-16], rax + mov rdi, [rbp-8] + + lea rdx, [rdi+OFFSET_STACK] + mov rcx, [rdi+OFFSET_STACK_SIZE] + + test rcx, 1 + jnz short .Lfix_align + +.Lfill_stack: + test rcx, rcx + jz short .Lstack_filled + + dec rcx + mov r11, [rdx+rcx*8] + push r11 + + jmp short .Lfill_stack + +.Lstack_filled: + mov al, [rdi+OFFSET_NUM_SSE_USED] + + movaps xmm7, [rdi+OFFSET_SSE_INOUT+112] + movaps xmm6, [rdi+OFFSET_SSE_INOUT+96] + movaps xmm5, [rdi+OFFSET_SSE_INOUT+80] + movaps xmm4, [rdi+OFFSET_SSE_INOUT+64] + movaps xmm3, [rdi+OFFSET_SSE_INOUT+48] + movaps xmm2, [rdi+OFFSET_SSE_INOUT+32] + movaps xmm1, [rdi+OFFSET_SSE_INOUT+16] + movaps xmm0, [rdi+OFFSET_SSE_INOUT] + + mov r9, [rdi+OFFSET_GPR_IN+40] + mov r8, [rdi+OFFSET_GPR_IN+32] + mov rcx, [rdi+OFFSET_GPR_IN+24] + mov rdx, [rdi+OFFSET_GPR_IN+16] + mov rsi, [rdi+OFFSET_GPR_IN+8] + + mov r11b, [rdi+OFFSET_RETURN_TYPE] + mov rdi, [rdi+OFFSET_GPR_IN] + + cmp r11b, RETURN_TYPE_JMP + je short .Ljmp_into_method + cmp r11b, RETURN_TYPE_JMP_STRET + je short .Ljmp_into_method + + mov r11, [rbp-16] + call r11 + +.Lafter_send: + mov rdi, [rbp-8] + mov [rdi+OFFSET_GPR_OUT], rax + mov [rdi+OFFSET_GPR_OUT+8], rdx + movaps [rdi+OFFSET_SSE_INOUT], xmm0 + movaps [rdi+OFFSET_SSE_INOUT+16], xmm1 + + mov r11b, [rdi+OFFSET_RETURN_TYPE] + + cmp r11b, RETURN_TYPE_X87 + je short .Lpop_long_double + + cmp r11b, RETURN_TYPE_COMPLEX_X87 + je short .Lpop_complex_long_double + +.Lreturn: + mov rsp, rbp + pop rbp ret -.fix_align: - xorq %r11, %r11 - pushq %r11 - jmp .fill_stack - -.lookup_stret: - movq OFFSET_GPR_IN+16(%rdi), %rsi - movq OFFSET_GPR_IN+8(%rdi), %rdi +.Lfix_align: + xor r11, r11 + push r11 + jmp short .Lfill_stack + +.Llookup_stret: + mov rsi, [rdi+OFFSET_GPR_IN+16] + mov rdi, [rdi+OFFSET_GPR_IN+8] call objc_msg_lookup_stret@PLT - jmp .after_lookup - -.jmp_into_method: - movq -16(%rbp), %r11 - jmp *%r11 - -.pop_long_double: - fstpt OFFSET_X87_OUT(%rdi) - jmp .return - -.pop_complex_long_double: - fstpt OFFSET_X87_OUT(%rdi) - fstpt OFFSET_X87_OUT+16(%rdi) - jmp .return + jmp short .Lafter_lookup + +.Ljmp_into_method: + mov r11, [rbp-16] + jmp r11 + +.Lpop_long_double: + fstp tbyte ptr [rdi+OFFSET_X87_OUT] + jmp short .Lreturn + +.Lpop_complex_long_double: + fstp tbyte ptr [rdi+OFFSET_X87_OUT] + fstp tbyte ptr [rdi+OFFSET_X87_OUT+16] + jmp short .Lreturn #ifdef OF_LINUX .section .note.GNU-stack, "", %progbits #endif Index: src/runtime/lookup-asm/lookup-asm-x86_64-macho.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86_64-macho.S +++ src/runtime/lookup-asm/lookup-asm-x86_64-macho.S @@ -14,62 +14,64 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" + +.intel_syntax noprefix .globl _objc_msg_lookup .globl _objc_msg_lookup_stret .globl _objc_msg_lookup_super .globl _objc_msg_lookup_super_stret .section __TEXT, __text, regular, pure_instructions .macro generate_lookup $0: - testq %rdi, %rdi + test rdi, rdi jz ret_nil - movq (%rdi), %r8 - movq 64(%r8), %r8 + mov r8, [rdi] + mov r8, [r8+64] Lmain_$0: - movq (%rsi), %rax - movzbl %ah, %ecx - movzbl %al, %edx + mov rax, [rsi] + movzx ecx, ah + movzx edx, al #ifdef OF_SELUID24 - shrl $$16, %eax + shr eax, 16 - movq (%r8,%rax,8), %r8 + mov r8, [r8+rax*8] #endif - movq (%r8,%rcx,8), %r8 - movq (%r8,%rdx,8), %rax + mov r8, [r8+rcx*8] + mov rax, [r8+rdx*8] - testq %rax, %rax + test rax, rax jz $1 ret .endmacro .macro generate_lookup_super $0: - movq %rdi, %r8 - movq (%rdi), %rdi - testq %rdi, %rdi + mov r8, rdi + mov rdi, [rdi] + test rdi, rdi jz ret_nil - movq 8(%r8), %r8 - movq 64(%r8), %r8 + mov r8, [r8+8] + mov r8, [r8+64] jmp Lmain_$1 .endmacro generate_lookup _objc_msg_lookup, _objc_method_not_found generate_lookup _objc_msg_lookup_stret, _objc_method_not_found_stret generate_lookup_super _objc_msg_lookup_super, _objc_msg_lookup generate_lookup_super _objc_msg_lookup_super_stret, _objc_msg_lookup_stret ret_nil: - leaq nil_method(%rip), %rax + lea rax, [rip+nil_method] ret nil_method: - movq %rdi, %rax + mov rax, rdi ret