2014-04-18 1 views
2

Я пытаюсь реализовать в log2 для целого числа в C++ в NaCl, я использовал способ asm, так как в документации по nacl сказано, что это единственный разрешенный способ писать ASM, что соответствует следующемуКак дать различную реализацию для ARM в NaCl

int log2(int x) { 
    int ret; 
    asm ("\tbsr %1, %0\n" 
     : "=r"(ret) 
     : "r" (x) 
); 
    return y; 
} 

, но оказывается ARM не поддерживает эту команду, поэтому я хочу, чтобы написать еще одну версию для только ARM. Есть ли способ сделать это?

Btw, я нашел одно решение этой конкретной функции уже, что с помощью

static inline int log2(int x) { 
    return sizeof(int) * 8 - __builtin_clz(x) - 1; 
} 

упоминается в другом посте, поэтому мой вопрос чисто о том, чтобы дать различные реализации для различных архитектуры процессора. (Я пытался #ifdef ARCH_ARM, но он не работает)

ответ

1

хрома использование нативный клиент NACL_BUILD_ARCH различать x86, руки и MIPS: https://chromium.googlesource.com/chromium/chromium/+/trunk/components/nacl/nacl_defines.gypi

(NB: Вы не можете использовать его, если вам «повторно с помощью PNaCl)

например: (от here)

#elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_BUILD_SUBARCH == 64 
    if (regs->prog_ctr >= NaClUserToSys(nap, NACL_TRAMPOLINE_START) && 
     regs->prog_ctr < NaClUserToSys(nap, NACL_TRAMPOLINE_END)) { 
    *unwind_case = NACL_UNWIND_in_trampoline; 
    regs->stack_ptr += 8; /* Pop user return address */ 
    return 1; 
    } 
#elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm 
    if (regs->prog_ctr >= NACL_TRAMPOLINE_START && 
     regs->prog_ctr < NACL_TRAMPOLINE_END) { 
    *unwind_case = NACL_UNWIND_in_trampoline; 
    regs->prog_ctr = NaClSandboxCodeAddr(nap, regs->lr); 
    return 1; 
    } 
#elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_mips 
    if (regs->prog_ctr >= NACL_TRAMPOLINE_START && 
     regs->prog_ctr < NACL_TRAMPOLINE_END) { 
    *unwind_case = NACL_UNWIND_in_trampoline; 
    regs->prog_ctr = NaClSandboxCodeAddr(nap, regs->return_addr); 
    return 1; 
    } 
#endif 

Кроме того, bsr имеет эквивалент в руке, если я правильно помню: http://fgiesen.wordpress.com/2013/10/18/bit-scanning-equivalencies/

+0

Понял! большое спасибо –

Смежные вопросы