Независимые от режима макросы

Если Вы хотите записать ассемблерный код, работающий и в 32-разрядном PowerPC и в 64-разрядных средах PowerPC, необходимо удостовериться, что специфичный код на 32 бита работает в 32-разрядных средах и специфичных выполнениях кода на 64 бита в 64-разрядных средах. Это приложение представляет макросы, включенные в OS X v10.4 SDK для упрощения разработки ассемблерного кода, работающего в обеих средах.

mode_independent_asm.h файл в /usr/include/architecture/ppc определяет ряд макросов, которые упрощают писать код, работающий в 32-разрядном PowerPC и 64-разрядных средах PowerPC. Они макросы включают и явные константы и псевдо мнемонику. Например, GPR_BYTES постоянный также 4 или 8 (размер регистров общего назначения). И lg псевдо мнемосхема расширяется до lwz в 32-разрядной среде или ld в 64-разрядной среде. Документы заголовочного файла все макросы подробно.

Например, 32-разрядный код для получения указателя при смещении 16 от GPR15 в GPR14:

    lwz r14,16(r15)

64-разрядный код:

    ld r14,16(r15)

Один способ поддерживать обе среды при помощи условных операторов включения. Например, следующее использование кода __ppc64__ определить, работает ли программа в 64-разрядном режиме и выполняет надлежащий оператор:

#ifdef __ppc64__
    ld r14,16(r15)
#else
    lwz r14,16(r15)
#endif

Однако более простой путь состоит в том, чтобы использовать lg псевдо мнемосхема, как показано здесь:

#include <architecture/ppc/mode_independent_asm.h>
    ...
    lg r14,16(r15)

Если Вы пишете код, вызывающий функции, которые могут быть перемещены, Вы, возможно, должны создать ленивый указатель символа в 32-разрядном коде, подобном этому:

    .lazy_symbol_pointer
L_foo$lazy_ptr:
    .indirect_symbol _foo
    .long dyld_stub_binding_helper

Последовательность сборки для что касается 64-разрядного кода, подобно 32-разрядному коду, но необходимо гарантировать, чтобы Вы выделили 8-байтовую площадь для символа, с помощью .quad вместо .long, как показано здесь:

    .lazy_symbol_pointer
L_foo$lazy_ptr:
    .indirect_symbol _foo
    .quad dyld_stub_binding_helper

Используя g_long независимый от режима макрос вместо .long или .quad, можно записать оптимизированную последовательность двойной среды, не добавляя #ifdef оператор. Независимая от режима последовательность была бы похожа на это:

#include <architecture/ppc/mode_independent_asm.h>
    ...
    .lazy_symbol_pointer
L_foo$lazy_ptr:
    .indirect_symbol _foo
    .g_long dyld_stub_binding_helper