2014-04-18 121 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!非常感谢 –

相关问题