MSIL有ROL和ROR指令吗?

问题描述 投票:4回答:2

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

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

这可能在IL吗?

c# cil
2个回答
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));

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以提取“进位”,AND来清除目标和要应用的OR。这必须在两个方向上镜像(低 - >高和高 - >低)。因为这个问题有点老,所以我不打算再去做一个例子。

© www.soinside.com 2019 - 2024. All rights reserved.