未使用 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”有何作用? 的相关文章

  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 对数字进行向上和向下舍入 C++

    我试图让我的程序分别向上和向下舍入数字 例如 如果数字是3 6 我的程序应该四舍五入最接近的数字 4 如果该数字是3 4 它将向下舍入为 3 我尝试使用ceil库获取 3 个项目的平均值 results ceil marks1 marks2
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 如何在不使用reinterpret_cast的情况下使用dlsym()加载函数?

    我正在尝试使用 clang tidy 来强制执行 C 核心指南 虽然它确实有很多有效点 但有一件事我无法真正解决 dlsym 返回一个void 我需要以某种方式将其转换为正确的函数指针 为此 我使用reinterpret cast 由于指南
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • C++0x 中的新 unicode 字符

    我正在构建一个 API 它允许我获取各种编码的字符串 包括 utf8 utf16 utf32 和 wchar t 根据操作系统 可能是 utf32 或 utf16 新的 C 标准引入了新类型char16 t and char32 t没有这么
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode

随机推荐

  • 是否可以使用函数进行 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