制限子

以前にgccインラインアセンブラでビット回転を書いたことがあった。(http://saito.hatenablog.jp/entry/20060423/p1) そのときは常に回転量をecxレジスタに入れるようにしていたのだけれど、可能な場合には即値にする方法がわかった。

static inline uint32_t rotl(uint32_t src, uint8_t n) {
  __asm__("roll %2,%1"
          : "=r"(src)
          : "0"(src), "cI"(n));
  return src;
}

制限子に"cI"を使うというだけのことだった。"c"はecxレジスタの意味で、"I"は即値の意味なわけだが、両方を書いておくとそのときに妥当な方を選んでくれるらしい。
Document ID: 86e3427012a8c74a6efa68a0f785dd82