Artifact df8949da43e3fceeef67127e88073e351451e74fe0d8c101e338c8b640fc0a31:
- File
src/invocation/call-x86_64-elf.S
— part of check-in
[a1da5c7b2d]
at
2019-02-18 20:55:15
on branch trunk
— Replace a few movdqa with movaps
movaps is smaller, and we don't know what kind of data is in there
anyway (and it's FP rather than integer in most cases anyway), so it
does not matter which move instruction we use. (user: js, size: 2945) [annotate] [blame] [check-ins using]
/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include "invoke-x86_64.h" .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 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 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 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 #ifdef OF_LINUX .section .note.GNU-stack, "", %progbits #endif