未使用 v0 的“vperm v0,v0,v0,v17”有何作用?

2024-01-03

我正在研究一个SHA-256 实施 https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-p8.cxx using Power8 内置 https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-p8.cxx。演技有点差了我估计每字节有大约 2 个周期 (cpb)。

对块执行 SHA 的 C/C++ 代码如下所示:

// Schedule 64-byte message
SHA256_SCHEDULE(W, data);

uint32x4_p8 a = abcd, e = efgh;
uint32x4_p8 b = VectorShiftLeft<4>(a);
uint32x4_p8 f = VectorShiftLeft<4>(e);
uint32x4_p8 c = VectorShiftLeft<4>(b);
uint32x4_p8 g = VectorShiftLeft<4>(f);
uint32x4_p8 d = VectorShiftLeft<4>(c);
uint32x4_p8 h = VectorShiftLeft<4>(g);

for (unsigned int i=0; i<64; i+=4)
{
    const uint32x4_p8 k = VectorLoad32x4u(K, i*4);
    const uint32x4_p8 w = VectorLoad32x4u(W, i*4);
    SHA256_ROUND<0>(w,k, a,b,c,d,e,f,g,h);
    SHA256_ROUND<1>(w,k, a,b,c,d,e,f,g,h);
    SHA256_ROUND<2>(w,k, a,b,c,d,e,f,g,h);
    SHA256_ROUND<3>(w,k, a,b,c,d,e,f,g,h);
}

我使用 GCC 编译程序-O3 and -mcpu=power8在 ppc64-le 机器上。当我查看反汇编时,我看到了其中的几个:

...
10000b0c:   a6 03 09 7d     mtctr   r8
10000b10:   57 02 00 f0     xxswapd vs32,vs32
10000b14:   6b 04 00 10     vperm   v0,v0,v0,v17
10000b18:   57 02 00 f0     xxswapd vs32,vs32
10000b1c:   99 57 00 7c     stxvd2x vs32,0,r10
10000b20:   99 26 0c 7c     lxvd2x  vs32,r12,r4
10000b24:   57 02 00 f0     xxswapd vs32,vs32
10000b28:   6b 04 00 10     vperm   v0,v0,v0,v17
10000b2c:   57 02 00 f0     xxswapd vs32,vs32
10000b30:   99 67 0a 7c     stxvd2x vs32,r10,r12
10000b34:   99 26 0b 7c     lxvd2x  vs32,r11,r4
10000b38:   57 02 00 f0     xxswapd vs32,vs32
10000b3c:   6b 04 00 10     vperm   v0,v0,v0,v17
10000b40:   57 02 00 f0     xxswapd vs32,vs32
10000b44:   99 5f 0a 7c     stxvd2x vs32,r10,r11
10000b48:   99 26 05 7c     lxvd2x  vs32,r5,r4
10000b4c:   57 02 00 f0     xxswapd vs32,vs32
10000b50:   6b 04 00 10     vperm   v0,v0,v0,v17
10000b54:   57 02 00 f0     xxswapd vs32,vs32
10000b58:   99 2f 0a 7c     stxvd2x vs32,r10,r5
...

The vperm v0,v0,v0,v17看起来像是死指令,因为v0排列后不使用。

什么是vperm v0,v0,v0,v17 do?


C++ 源代码位于sha256-p8.cxx https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-p8.cxx.

源文件是用g++ -g3 -O3 -Wall -DTEST_MAIN -mcpu=power8 sha256-2-p8.cxx -o sha256-2-p8.exe.

完整的反汇编可在PPC64 SHA-256 拆解 https://pastebin.com/hsBhLxxw.


我认为上面的片段是由SHA256_SCHEDULE。我看到的集合VectorShiftLeft (vsldoi) 在相关块之后。

进一步归零,我相当确定它是前 16 个单词的字节序交换器:

const uint8x16_p8 mask = {3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12};
for (unsigned int i=0; i<16; i+=4)
    VectorStore32x4u(VectorPermute32x4(VectorLoad32x4u(data, i*4), mask), W, i*4);

SHA256_SCHEDULE看起来像这样:

// +2 because Schedule reads beyond the last element
void SHA256_SCHEDULE(uint32_t W[64+2], const uint8_t* data)
{
#if (__LITTLE_ENDIAN__)
    const uint8x16_p8 mask = {3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12};
    for (unsigned int i=0; i<16; i+=4)
        VectorStore32x4u(VectorPermute32x4(VectorLoad32x4u(data, i*4), mask), W, i*4);
#else
    for (unsigned int i=0; i<16; i+=4)
        VectorStore32x4u(VectorLoad32x4u(data, i*4), W, i*4);
#endif

    // At i=62, W[i-2] reads the 65th and 66th elements. W[] has 2 extra "don't care" elements.
    for (unsigned int i = 16; i < 64; i+=2)
    {
        const uint32x4_p8 s0 = Vector_sigma0(VectorLoad32x4u(W, (i-15)*4));
        const uint32x4_p8 w0 = VectorLoad32x4u(W, (i-16)*4);
        const uint32x4_p8 s1 = Vector_sigma1(VectorLoad32x4u(W, (i-2)*4));
        const uint32x4_p8 w1 = VectorLoad32x4u(W, (i-7)*4);

        const uint32x4_p8 r = vec_add(s1, vec_add(w1, vec_add(s0, w0)));
        VectorStore32x4u(r, W, i*4);
    }
}

这是相关部分的图像v0突出显示。


乍一看,您已经完成了所有繁重的工作,该屏幕截图看起来很像 LE 字节序交换器部分。我假设你就在这里。我预计 v17 是掩码变量 - 它之前从 TOC 中加载为 vs49。

您缺少的关键信息是 v0 是 vs32(我知道这令人困惑)。我不确定展示这一点的最佳位置在哪里,但 ABI 就可以了。你可以在这里下载:https://members.openpowerfoundation.org/document/dl/576 https://members.openpowerfoundation.org/document/dl/576.

图 2-17。作为 VSR 一部分的向量寄存器第 44 页应该有助于说明我的意思,这就是硬件中的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未使用 v0 的“vperm v0,v0,v0,v17”有何作用? 的相关文章

随机推荐

  • 是否可以使用函数进行 regexp_replace ?

    我想对字符串中的值进行一些计算 最后替换它们 Oracle 正则表达式似乎很好 但 1 在所有计算结束时都会被评估 所以我想知道在将其传递给函数之前是否可以进行评估 set serveroutput on declare l foo var
  • 如何在TextView上斜划线

    有没有简单的方法如何在 TextView 上绘制斜删除线 现在我正在使用这段代码 textview setPaintFlags textview getPaintFlags Paint STRIKE THRU TEXT FLAG But I
  • 将预测张量转换为图像

    使用tensorflow js 我已成功导入模型并从中返回预测 接下来我想将该预测从张量转换为图像 我的第一个想法是去张量 gt js 数组 gt 一些画布情况 不过 我敢打赌有一种更简单的方法可以做到这一点 希望不必涉及节点 但我对此持开
  • Python 连续运行单元测试或每个测试多次

    我编写了单元测试用例来测试我的应用程序 它按预期工作 没有任何问题 下面是一些示例测试用例 import os import unittest class CreateUser unittest TestCase def setUp sel
  • 使用JQuery为“窗口”绑定“焦点”和“模糊”功能,在IE中不起作用

    我需要像下面这样使用 JQuery var focusFlag 1 jQuery window bind focus function event focusFlag 1 jQuery window bind blur function e
  • ruby 3.0.4,redmine 5.0.0,rails 6.1.4,使用 webrick 启动测试安装失败,“参数数量错误”

    新的 ubuntu 20 系统具有以下内容 ruby 3 0 4 rails 6 1 4 redmine 5 0 0 安装后 尝试启动 webrick 测试服务器 bundle exec rails server webrick e red
  • lm 命令中“导出的符号”是什么意思

    我正在与 WinDbg 进行调试器会话 我输入lm命令 它显示加载的模块 但我不太明白下面的 导出符号 是什么意思 048c0000 0550c000 Db export symbols Db dll 05520000 05535000 G
  • 采用 const 参数的默认移动构造函数

    定义类时 以下内容有效吗 T const T default 我正在阅读有关移动构造函数的内容here http en cppreference com w cpp language move constructor它解释了如何仍然可以隐式
  • 如何对守护程序进行内存检查?

    我编写了一个 C 应用程序 它会永远运行直到手动终止 它监视其他重要的应用程序 因此 我的守护进程应用程序不应停机 记住这一点 我想看看我的应用程序中是否存在内存泄漏 我使用了 valgrind 但由于该应用程序永远运行 因此 valgri
  • 将嵌套文件夹内容递归复制到一个文件夹(终端)

    我有一个 WordPress 上传文件夹 该文件夹使用子文件夹构建了几个月 wolfr2 uploads wolfr tree 2007 08 beautifulkatamari jpg beautifulkatamari thumbnai
  • boost::bind 何时将参数强制转换为所需类型?

    当我使用 boost bind 将参数绑定到函数时 它们何时被转换为函数所需的类型 如果可以隐式转换 它们如何存储在bind t对象中 作为最初传递给绑定的类型还是作为函数签名所需的类型 具体来说 如果我有签名的功能 void SomeFu
  • 如何使用 python 发送 AT GSM 命令?

    如何使用 python 发送 AT GSM 命令 我能够使用 Delphi 和一些 comport 组件 TComport 很容易地做到这一点 但是我如何使用 python 与我的调制解调器对话 Gath 我用 pyserial 这样做 i
  • 上传某些文件时$_FILES和$_POST数据为空

    我注意到 根据我上传的视频 有时整个 POST and FILES数组将为空 这是一个奇怪的现象 但我在一些视频中发现了它 为了测试 我使用的视频全部是video mp4文件类型
  • Cross-Origin Read Blocking (CORB) 阻止跨源

    Error 请求的资源上不存在 Access Control Allow Origin 标头 起源 https abcd com https abcd com 因此不允许访问 响应的 HTTP 状态代码为 403 每当我尝试从 Angula
  • 注销时不转到上一页

    我有一个jsp项目 我使用会话来获取用户权限 我用过 session invalidate 在注销页面中 注销后 当我按后退按钮时 它会显示上一页 我不希望它这样做 请在这件事上给予我帮助 您可以将 html 上的缓存设置为在注销确认页面上
  • 从字符串中获取转义的 unicode 代码

    我似乎遇到了与开发界其他人相反的问题 我需要从字符串生成转义字符 例如 假设我有这个词MESSAGE 我需要生成 u004D u0045 u0053 u0053 u0041 u0047 u0045 u003A u0053 u0069 u00
  • 查找 PostgreSQL 中不为 NULL 的列

    我为每个表分配了一个任务来计算可为空的列 简单的 SELECT table name count FROM INFORMATION SCHEMA COLUMNS WHERE is nullable NO GROUP BY table nam
  • 如何使用 SQLAlchemy 声明式创建复合列?

    我经常用Text保存 Markdown 格式的富文本的列 我的模型看起来像这样 class Document Base id Column Integer primary key True title Column Unicode 250
  • gzipped json 与高效二进制序列化的性能

    JSON 和 Gzip 是序列化数据的简单方法 这些在编程语言中广泛实现 而且这种表示形式可以跨系统移植 是吗 我的问题是 与非常高效的二进制序列化方法相比 json gzip 是否足够好 成本低于 2 倍 我正在寻找序列化各种数据时的空间
  • 未使用 v0 的“vperm v0,v0,v0,v17”有何作用?

    我正在研究一个SHA 256 实施 https github com noloader SHA Intrinsics blob master sha256 p8 cxx using Power8 内置 https github com no