如何在NaCl中给出ARM的不同实现
How to give different implementation for ARM in NaCl
我试图在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/
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- ARM 上的无锁 SPSC 队列实现
- ARM的自定义堆栈跟踪实现
- 如何在NaCl中给出ARM的不同实现
- 有人可以帮助我理解stmdb,ldmia,以及如何用arm汇编语言实现这个C++代码吗?