simd_srlow/simd_sllow函数运行结果不正确



  • 在从核中将uintv8向量的第0个字节(值为97)移位到第31个字节,代码如下

      simd_print_uintv8(inpwd);
    
      int shamt = (32 - len) << 3;
    
      inpwd = simd_sllow((uint256)inpwd, shamt);
    
      simd_print_uintv8(inpwd);
    

    当len的值为1时,shamt = 248,输出如下,可以计算出实际只左移了28位

    [ 0, 0, 0, 0, 0, 0, 0, 97 ]
    [ 0, 0, 0, 0, 0, 0, 6, 268435456 ]
    

    而当代码改为如下形式后,

      simd_print_uintv8(inpwd);
    
      int shamt = 248;
    
      inpwd = simd_sllow((uint256)inpwd, shamt);
    
      simd_print_uintv8(inpwd);
    

    输出结果如下,可以计算出实际左移了248位,符合预期

    [ 0, 0, 0, 0, 0, 0, 0, 97 ]
    [ 1627389952, 0, 0, 0, 0, 0, 0, 0 ]
    

    为何shamt的值相同,但simd_sllow函数得到的结果完全不同?



  • 旧版编译器似乎一直有这样的问题。。。如果移位的位数为变量,似乎把类型转成intv8或者int256应该会产生正确的结果。


Log in to reply