以前に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