2014-04-18 123 views
2

我想在NaCl中使用C++中的整數實現log2,我使用asm方式,因爲nacl文檔說它是唯一允許的寫入ASM的方法,如下所示如何在NaCl中給出不同的實現方法

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

,但事實證明,ARM不支持這條指令,所以我只想爲ARM寫另一個版本。有沒有辦法做到這一點?

順便說一句,我找到了一個解決方案,已在這個特定的功能,這是通過使用

static inline int log2(int x) { 
    return sizeof(int) * 8 - __builtin_clz(x) - 1; 
} 
在另一篇文章中提到

,所以我的問題是純粹的打算放棄針對不同的CPU架構不同的實現方式。 (我試過的#ifdef ARCH_ARM,但它沒有工作)

回答

1

鉻本地客戶端使用NACL_BUILD_ARCH x86的區分,ARM和MIPS:https://chromium.googlesource.com/chromium/chromium/+/trunk/components/nacl/nacl_defines.gypi

(注:你不能,如果你使用它「重新使用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

Got it!非常感謝 –

相關問題