MSIL有ROL和ROR指令吗?

时间:2010-07-10 19:35:37

标签: c# cil

我写了一个Int128类型,效果很好。我认为我可以通过一个简单的想法改进其性能:改进有点笨拙的换档操作。

因为它们在乘法和除法中被大量使用,所以改进会产生连锁反应。所以我开始创建一个动态方法(向低位移动并旋转高位),只发现没有OpCodes.Rol或OpCodes.Ror指令。

这可能在IL吗?

2 个答案:

答案 0 :(得分:4)

没有

您需要使用位移

来实现它
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));

答案 1 :(得分:2)

7年后部分回答这个问题,万一有人需要它。

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

MSIL不直接包含ROR或ROL操作,但有些模式会使JIT编译器生成ROR和ROL。 RuyJIT(.Net和.Net核心)支持这一点。

使用此模式改进.Net Core的详细信息为discussed here,一个月后.Net核心代码为updated to use it

查看implementation of SHA512我们找到了ROR的例子:

    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以提取&#34;进行&#34;,AND以清除目标和要应用的OR。这必须在两个方向上镜像(低 - >高和高 - >低)。因为这个问题有点陈旧,所以我不打扰一个例子。