代码之家  ›  专栏  ›  技术社区  ›  Tergiver

MSIL是否有ROL和ROR指令?

  •  4
  • Tergiver  · 技术社区  · 15 年前

    这在伊利诺伊州可能吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   codekaizen    15 年前

    不。

    您需要通过位移位来实现它

    UInt64 highBits = 0;
    UInt64 lowBits = 1;
    Int32 n = 63;
    var altShift = (n - 63);
    
    var lowShiftedOff = (n - 63) > 0 ? 0 : (lowBits << n);
    var highShiftedOff = (n - 63) > 0 ? 0 : (highBits << n);
    
    var highResult = (UInt64)(highShiftedOff | (altShift > 0 ? (lowBits << altShift - 1) : 0));
    var lowResult= (UInt64)(lowShiftedOff | (altShift > 0 ? (highBits << altShift - 1) : 0));
    
        2
  •  3
  •   Tedd Hansen    7 年前

    7年后部分回答这个问题,以防有人需要。

    您可以在.Net中使用ROR/ROL。

    MSIL不直接包含ROR或ROL操作,但是有一些模式可以让JIT编译器生成ROR和ROL。RuyJIT(.Net和.Net core)支持这一点。

    改进.Net内核以使用此模式的细节如下: discussed here 一个月后.Net核心代码 updated to use it

    在看 implementation of SHA512

        public static UInt64 RotateRight(UInt64 x, int n) {
            return (((x) >> (n)) | ((x) << (64-(n))));
        }
    

    以同样的模式延伸到ROL:

        public static UInt64 RotateLeft(UInt64 x, int n) {
            return (((x) << (n)) | ((x) >> (64-(n))));
        }
    

    要对128位整数执行此操作,可以将其处理为两个64位,然后AND提取“进位”,并清除目标AND或以应用。这必须在两个方向上镜像(低->高和高->低)。因为这个问题有点老了,所以我不想为一个例子费心。