当前位置: 首页 > 知识库问答 >
问题:

x86_64如果N

拓拔骁
2023-03-14
if(N < word_size) {
    dst[N] = 1; // as in Nth bit of dst = 1 
}
else {
    dst[word_size - 1:0] = 0
} 
// rsi has length
L(keep_searching):
movq %(rdi), %rax
testq %rax, %rax
jnz L(found)
subq $64, rsi
jbe L(done) // this done will return origional value of rsi
addq $8, %rdi
jmp L(keep_searching)

谢了!

几个版本,是工作良好的我为32位。如果我使用MMX@PeterCordes指出PLLSQ正是我想要的。


uint64_t __attribute__((noinline, noclone)) shift(uint64_t cnt) {
    uint64_t ret = 0;
    asm volatile(
        "cmpq $32, %[cnt]\n\t"
        "setbe %b[ret]\n\t"
        "shlxq %[cnt], %[ret], %[ret]\n\t"
        : [ ret ] "+r"(ret)
        : [ cnt ] "r"(cnt)
        : "cc");
    return ret;
}


uint64_t __attribute__((noinline, noclone)) shift2(uint64_t cnt) {
    uint64_t ret = 0, tmp = 0;
    asm volatile(
        "leaq -33(%[cnt]), %[tmp]\n\t"
        "movl $1, %k[ret]\n\t"
        "shlxq %[cnt], %[ret], %[ret]\n\t"
        "sarq $63, %[tmp]\n\t"
        "andq %[tmp], %[ret]\n\t"
        : [ ret ] "+r"(ret), [ tmp ] "+r"(tmp), [ cnt ] "+r"(cnt)
        :
        : "cc");
    return ret;
}


uint64_t __attribute__((noinline, noclone)) shift3(uint64_t cnt) {
    uint64_t ret, tmp;
    asm volatile(
        "leaq -33(%[cnt]), %[tmp]\n\t"
        "btsq %[cnt], %[ret]\n\t"
        "sarq $63, %[tmp]\n\t"
        "andq %[tmp], %[ret]\n\t"
        : [ ret ] "+r"(ret), [ tmp ] "+r"(tmp), [ cnt ] "+r"(cnt)
        :
        : "cc");
    return ret;
}

共有1个答案

秦安怡
2023-03-14

还没有核实,但是

mov rax, 1  // common
mov rdx, 0  // common

cmp rcx, 64
shlxq rbx, rax, rcx
cmova rbx, rdx

可能比建议的替代方案性能稍好,因为比较和移位现在是独立的,可以并行执行。

编辑

 类似资料:
  • 问题内容: 我正在尝试在x86_64上编译glibc(作为次要的,不是系统的替代品)2.6,并试图使其生成32位对象。当我给它一个标准配置时,它可以很好地编译,生成通常的64位库对象。一些信息: 07:32:21 \ EST 2010 x86_64 x86_64 x86_64 GNU/Linux 除其他外,我尝试了以下方法: 尝试1: 尝试2: 配置成功,但是会导致一系列编译错误,如下所示: 如果

  • 问题内容: 我想像gdb一样获得类似输出。但是我想直接通过这样做。我的平台是Linux,x86;以及后来的x86_64。 现在,我只想从堆栈中读取返回地址,而无需转换为符号名称。 因此,对于测试程序,通过以下方式进行编译: 我将启动一个程序,并从一开始就连接到测试程序。然后,我将执行PTRACE_CONT并等待信号。当测试程序会做一次自杀;信号将被传送到我的程序。这时我想读取返回地址,它们就像(因

  • Linux,全称GNU/Linux,是一套免费使用和自由传播的类 UNIX 操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到 Minix 和 Unix 思想的启发。

  • 问题内容: 我可以用吗: 代替 后者似乎太冗长。有区别吗? 问题答案: 该声明 将调用(请参阅特殊方法名称文档)并使用该函数的返回值。总结如下: 要求执行真值测试和内置操作;应该返回或,或者它们的整数等效值或。如果未定义此方法,则调用该方法(如果已定义),并且如果其结果为非零,则将该对象视为true。如果一个类既未定义,也未定义,则其所有实例均被视为true。 另一方面, 仅 将参考与进行比较以查

  • 本文向大家介绍knockout.js 如果/如果不是,包括了knockout.js 如果/如果不是的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用if绑定来确定是否应创建节点的子元素。 if绑定的逆是ifnot 相当于 有时,您无需创建容器就无法控制元素的存在(通常是针对中的<li>元素<ul>或中的<option>元素<select>) 淘汰赛可使用基于注释标签的无容器控制流语法来实现

  • 问题内容: 任何人都可以参考x86_64 ABI(在Linux上使用的)的表示形式?我正在尝试调试一些代码,这些代码中的堆栈或参数似乎已损坏,这确实有助于理解我 应该 看到的内容… 问题答案: 我发表了评论。 这可能会有所帮助。这是一个参考,尽管很轻巧( 编辑 :原始链接已失效;已替换Wayback Machine保留的链接)。 变量参数列表参考从第50页开始,然后在第52-53页的文档中继续: