如何在NaCl中给出ARM的不同实现

How to give different implementation for ARM in NaCl

本文关键字:ARM 实现 NaCl      更新时间:2023-10-16

我试图在log2中用C++在NaCl中实现整数,我使用了asm方式,因为NaCl文档说这是唯一允许的写asm的方式,如下所示

int log2(int x) {
  int ret;
  asm ( "tbsr %1, %0n"
      : "=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,但它不起作用)

chromium本机客户端使用NACL_BUILD_ARCH来区分x86、arm和mips:https://chromium.googlesource.com/chromium/chromium/+/trunk/components/nacl/nacl_defines.gypi

(注意:如果你使用PNaCl,你就不能使用它)

例如:(从这里开始)

#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/