【问题标题】:How to give different implementation for ARM in NaCl如何在 NaCl 中为 ARM 提供不同的实现
【发布时间】:2014-04-18 07:32:01
【问题描述】:

我正在尝试在 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,但没用)

【问题讨论】:

    标签: c++ assembly google-nativeclient


    【解决方案1】:

    chromium 原生客户端使用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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2017-10-28
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多