- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个归零的 128 位寄存器,我想左移并添加一个字节。我可以通过以下方式改变它:
pslldq xmm0, 1
...但现在我想将 al 复制到空白处。像这样的东西:
or xmm0, al
这当然行不通。我只希望最低 8 位受影响。这将处于一个循环中,其中连续的 al 值将用于填充寄存器。所以我需要某种 mov 指令或其他替代方案。
理想的情况是用一条指令左移 8 位并插入,但我认为这种情况不存在。
我花了很多时间翻遍 x86-64 指令集数据,但找不到任何可以让我做我想做的事情的东西。可以吗?
更新:尝试pinsrb后,我发现代码逻辑有错误。 pinsrb 会很棒,但不幸的是它只能使用立即索引,而不能使用寄存器。
我正在从非连续位置获取字节,因此我认为我需要一次获取一个字节。字节数可以是 1 到 16 之间的任意值。我抓取的第一个字节应该以 xmm0 的最低字节结束,下一个字节进入下一个最低字节,依此类推。
最佳答案
Intel's intrinsics guide 对于查找向量指令很有用。它列出了 asm 助记符以及内在函数(您可以通过助记符而不是内在函数进行搜索,因为搜索会匹配条目的整个文本)。
英特尔的 PDF 引用手册也有索引。 insn set ref 手册是第 2 卷。请参阅 x86 标签 wiki 中英特尔手册的链接。
<小时/> SSE4.1 PINSRB 可以完全按照您的要求进行操作,但这将在 Haswell 及更高版本上的每个时钟一次洗牌上产生瓶颈,无法实现每个时钟吞吐量 2 个负载。 (每个pinrsb xmm、[mem]、imm8
2 个 uops,其中一个用于端口 5,一个用于负载端口)。
您不需要向左移动向量,因为带有合并指令 (PINSR*) 的整数 -> 向量插入采用插入位置的索引。 (并且已经需要洗牌微指令,因此每次使用相同的位置并移动向量对性能没有好处。)
对于这个问题:将16个字节单独插入到一个向量中并不是最有效的做法。将它们以 4 或 8 为一组组装在整数寄存器中可能是更好的方法。
;; b0 .. b15 are whatever addressing mode you want.
;; if you could get more than 1 of b0..b15 with a single vector load (i.e. there is some locality in the source bytes)
;; then DON'T DO THIS: do vector loads and shuffle + combine (pshufb if needed)
movzx eax, byte [b2] ; break the
mov ah, byte [b3]
shl eax, 16 ; partial-reg merge is pretty cheap on SnB/IvB, but very slow on Intel CPUs before Sandybridge. AMD has no penalty, just (true in this case) dependencies
mov al, byte [b0]
mov ah, byte [b1]
;; 5 uops to load + merge 4 bytes into an integer reg, plus 2x merging costs
movd xmm0, eax # cheaper than pinsrd xmm0, edx, 0. Also zeros the rest of the vector
;alternative strategy using an extra OR, probably not better anywhere: I don't think merging AL and AH is cheaper than merging just AH
;two short dep chains instead of one longer one isn't helpful when we're doing 16 bytes
movzx eax, byte [b4]
mov ah, byte [b5]
movzx edx, byte [b6]
mov dh, byte [b7]
shl edx, 16
or edx, eax
pinsrd xmm0, edx, 1
;; Then repeat for the next two dwords.
...
pinsrd xmm0, edx, 2
...
pinsrd xmm0, edx, 3
您甚至可以继续使用 movq
/pinsrq
的整数寄存器,但有 4 个独立的 dep 链,每个 dep 链只有一个 shl
整数 reg 可能更好。
更新:Haswell/Skylake 上的 AH 合并并非免费。合并 uop 甚至可能需要自己在一个周期中发出(即使用前端发出带宽的 4 个插槽。)请参阅 How exactly do partial registers on Haswell/Skylake perform? Writing AL seems to have a false dependency on RAX, and AH is inconsistent
对于其他 uarches: Why doesn't GCC use partial registers? 。特别是在 AMD 和 Silvermont 上,部分注册表写入依赖于完整注册表。这正是我们想要的吞吐量;没有额外的合并uop。 (除 Intel P6 系列及其 Sandybridge 系列后代之外的任何产品都是这种情况,其中部分寄存器重命名有时很有用,但在这种情况下是有害的。)
<小时/>如果您不能假设 SSE4,那么您可以使用pinsrw (SSE2)。或者,最好将 movd 和 shuffle 向量与 PUNPCKLDQ / PUNPCKLDQD 一起使用。 (该链接是英特尔手册中的 HTML 摘录)。
请参阅 Agner Fog's Optimizing Assembly guide(和指令表/微体系结构指南)来决定什么样的指令序列实际上是好的。
关于assembly - 如何将(最多)16 个单字节移动到 XMM 寄存器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39552813/
看来我又被一个简单的正则表达式卡住了。 我想要什么: 1 到 999 之间的数字 可选:逗号、符号 如果输入逗号,最少1位小数,最多3位小数点应该是presebt。 Allowed: 100 999,
我需要从两列中获取最大值并将其发送到第三列。这些列的大小都是统一的,但有时大小会有所不同,但它们都将从同一个单元格开始。例如: 5 8 - 6 2 - 6 5 - 带有破折号的列需要找到其他两个之间的
我在我的网站上有一张包含用户排名列的表格,排名是一个数字,我想选择排名最高的 3 个用户,所以我查看并搜索了我认为最好的查询是那:Link (正确答案的第二个查询),但我不明白查询,如果有人能一步一步
我正在尝试制作一个点击计数器,我想收集 24 小时内的总点击次数。无论最终用户位于哪个时区,这 24 小时都应该是固定值。在 24 小时内,数据库应更新为 +1 次点击计数,一旦达到 24 小时时间范
我有一个在典型共享主机上运行的 PHP + MySQL Web 应用程序,我想知道调用最多的查询是什么以及消耗的资源量是多少。这样,我将专注于最昂贵的查询以优化资源或检测优化不佳的查询。 例如: qu
这是我“尝试”从用户输入的数字中找到最大 2 个值的代码: #include using namespace std; void maximum2(int a, int& max1,int& max
我需要编写一个 Python 函数,从具有最多“o”字符的字符串中返回单词。例如,get_most_ooo_word(['aa ao ooo']) 应该返回 ['ooo'] 和 get_most_oo
我正在寻找一种哈希算法,以创建尽可能接近字符串的唯一哈希值 (max len = 255),从而生成一个长整数 (DWORD)。 我意识到26^255 >> 2^32,但也知道英语的单词数远少于2^3
我得到了一个仅由 's','t','u','v' 作为字符组成的字符串 T。我想找到长度为 |T| 的字符串数它最多与 T 不同 n 个位置。而且每个这样的字符串在三个不同的位置不能有相同的字符,这些
我有一群“专家”(大约 300 人)可以胜任一项工作。而且我有很多工作必须完成,比如说大约 500 个。我也有信息,一个专家能做某项工作有多“好”。这将导致一个 300 x 500 的矩阵来保存权重。
我正在尝试解决这个问题,虽然我可以使用蛮力解决它,但是以下优化算法为我提供了一些测试用例的错误结果。我尝试了但无法找到代码的问题,任何人都可以帮助我。 问题:给定一个字符串 S 和整数 K,找到整数
我需要一个混合长度的正则表达式验证,总长度为 6 个字符,其中 4-6 个大写/数字字符和 0-2 个空格。 我试过 ^[A-Z0-9]{4,6}+[\s]{0,2}$ 但它导致最大长度为 8 个字符
我有一个数组 {-1,2,3,4,-3,-2,1,5} 现在我想找到给定数组的最小连续总和子数组,最多 K 次交换。 在上面的数组中,最小连续和是-5,子数组是{-3,-2} 对于 K=1 我应该如何
我们有一个简单的表格如下: ------------------------------------------------------------------------ | Name |
如果哈希不能超过 4 个字符,并且这 4 个字符只能是小写字母或数字,那么创建 String 哈希的最佳方法是什么? 我要散列的字符串有 1-255 个字符。我知道在没有冲突的情况下创建 4-char
我希望使用 Multipeer Connectivity 框架,并感谢任何关于如何最好地进行的经验之谈。 我需要在“教练”设备和最多 45 个“玩家”设备之间建立连接。他们都在同一个空间,但无法预测
给定一个数组 a,什么是实现其组合直到第 n 的最佳方法?例如: a = %i[a b c] n = 2 # Expected => [[], [:a], [:b], [:c], [:a, b], [
这个问题在这里已经有了答案: Formatting floats without trailing zeros (21 个回答) 关闭8年前。 我想格式化最多包含 2 个小数位的 float 列表。但
我无法使用以下形式的命令登录到远程 docker 注册表: docker login –u my-username –p my-password registry.myclient.com 我得到的错
所以这是我的代码:服务器.java import java.io.*; import java.net.*; import java.util.*; class Server implements R
我是一名优秀的程序员,十分优秀!