c++ - 如何在 NaCl 中为 ARM 提供不同的实现

标签 c++ assembly google-nativeclient

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

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,但没用)

最佳答案

chromium native 客户端使用 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 在 arm 中有一个等效项:http://fgiesen.wordpress.com/2013/10/18/bit-scanning-equivalencies/

关于c++ - 如何在 NaCl 中为 ARM 提供不同的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23149545/

相关文章:

linux - 在 Windows 上编译 Linux 汇编器

assembly - 从 EQU 符号名表示浮点常数

c++ - 在使用 NaCl 的 C++ 中,如何按值对 JSON 对象进行排序?

c++ - NACL 的 NPAPI 插件

c++ - 使用 2003 ISO C 绑定(bind)在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

c++ - 何时使用构造函数和析构函数,尤其是在容器和跨线程中

c++ - LRU 缓存如何比 HashMap 更快?

c++ - 具有结构 vector 的类,其中包含相同的类

c - 为什么像这样初始化二维数组会更糟​​?

google-nativeclient - 在 Windows 上,如何在 Chrome 之外运行 Google 的 Native Client?