0

C语言中popcnt函数的简单实现:

int popcnt(uint64_t x) {
  int s = 0; 
  for (int i = 0; i < 64; i++) {
    if ((x << i) & 1 == 1) s++;
  }
  return s;
}

我正在使用内联汇编语言(x86-64)来实现popcnt,

int asm_popcnt(uint64_t x) {
  int i = 0, sum = 0;
  uint64_t tmp = 0;
  asm ( ".Pct:               \n\t"
        "movq   %[xx],  %[tm]\n\t"
        "andq    $0x1,  %[tm]\n\t"
        "test   %[tm],  %[tm]\n\t"
        "je      .Grt        \n\t"
        "incl   %[ss]        \n\t"
        ".Grt:               \n\t"
        "shrq    $0x1,  %[xx]\n\t"
        "incl   %[ii]        \n\t"
        "cmpl   $0x3f,  %[ii]\n\t"
        "jle     .Pct        \n\t"
        : [ss] "+r"(sum)
        : [xx] "r"(x)  , [ii] "r"(i), 
          [tm] "r"(tmp)
  );
  return sum;
}

但收到了WA(在线评委)

我在我的计算机上测试了 2 的所有幂(从 0x1 到 (0x1 << 63)),它返回 1,这表明我的 asm_popcnt 可以识别任何 64_bits 整数的所有位,因为所有其他整数只是 0x1、0x2、 0x4 等(例如,0x11a = 0x2“或”0x8“或”0x10“或”0x100)。因此,OJ 不应该返回“WA”。我的代码有什么问题吗?跳转指令?

4

0 回答 0