Как использовать GestureDetector для дочерних элементов стека

В системе x86_64 обе функции могут быть скомпилированы в один и тот же код. Я «замаскировал» разборку примерно эквивалентным кодом C:

f_or_g:
    pushq   %rbp                 ; // Standard stack frame setup
    movq    %rsp, %rbp           ; // same
    movl    OFFSET1(%rip), %eax  ; eax = c;
    addl    OFFSET2(%rip), %eax  ; eax += b;
    movq    OFFSET3(%rip), %rcx  ; rcx = &a;
    movl    %eax, (%rcx)         ; *rcx = eax;
    popq    %rbp                 ; // Standard stack frame teardown
    retq                         ; return

Так как x86_64 использует eax в качестве возвращаемого регистра для 32-битных значений, результат добавления находится в «правильном» place ", чтобы вернуть его уже - дополнительный код не требуется.

В более сложных функциях могут быть некоторые незначительные накладные расходы, необходимые для обеспечения возврата возвращаемого значения в правый регистр. Вообще говоря, эти накладные расходы должны быть минимальными.

Тот же принцип применяется к большинству других архитектур - это не относится к x86_64; Я просто использую его, потому что это первый компилятор, который пришел в руки.

0
задан iLikeCamelCase 18 January 2019 в 19:16
поделиться