- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 x86/SIMD 汇编中,我用我需要转换的图形图像的四个 32 位像素填充了一个 XMM 寄存器。然而,像素是 10 位打包的 RGB 格式,所以它们以 32 位的形式存在:
[ red ][ green ][ blue ][]
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
最后两位是填充位,未使用。
我需要将这些像素乘以另一个值,但该值需要被屏蔽,因此它只影响红色像素。该值是常量,因此可以进行硬编码。假设该值为 0.1234。我如何将它放入另一个具有适当屏蔽的 XMM 寄存器中,以便它只影响每个 32 位段的红色部分?
以图形方式说明,我想做这样的事情:
XMM0 (first 32 bit segment):
[ 0.1234 ][ 1.0 ][ 1.0 ][]
*
XMM1 (first 32 bit segment):
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
结果是 XMM0 和 XMM1 的乘积。当然,这个 32 位段将在整个 XMM 寄存器中重复,我只是在这里指定了前 32 位,所以你明白了。
最佳答案
如果您真的只想影响红色部分,您也许可以想出一个技巧,将红色和部分绿色乘以某个常数(将寄存器视为 16 位短裤的集合)并且然后将新的红色部分与旧的绿色和蓝色部分重新组合。
如果您要对所有颜色进行操作,更好的策略是使用 shift 和 shuffle(以及可能转换为 float) 操作。然后进行所有计算,然后打包回去。
如果您曾经重复使用任何值(例如,如果您正在计算一个过滤器内核)并且您正在使用 float ,那么如果您解压并转换为 float 一次 然后一遍又一遍地重复使用那个值。即使您必须创建一个循环将整行解压缩为 32 位 float ,然后再对其进行操作并重新打包整行。
关于c - 需要将一个 XMM 寄存器乘以另一个,但具有位掩码值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14943822/
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
从 SIMD 寄存器加载和存储生成用途寄存器的最佳方式是什么?到目前为止,我一直使用堆栈作为临时的。例如, mov [rsp + 0x00], r8 mov [rsp + 0x08], r9 mov
我正在尝试实现一些内联汇编器(在 C/C++ 代码中)以利用 SSE。我想将值(从 XMM 寄存器或内存)复制并复制到另一个 XMM 寄存器。例如,假设我在内存中有一些值 {1, 2, 3, 4}。我
在多核 CPU 中,每个核是否都可以访问自己的 XMM 寄存器组?例如,如果一个芯片被列为具有 16 个 XMM 寄存器 (XMM0-XMM15),那么每个内核 16 个寄存器还是 16 个共享? 我
我发现很难在 Visual Studio 的寄存器窗口中解释 xmm 寄存器的值。窗口显示以下内容: XMM0 = 00000000000000004018000000000000 XMM1 = 00
pushf //couldnt store this in other registers movd xmm0,eax//storing in xmm registers
我正在使用 AES-NI在内核代码中。 AES 新指令使用 XMM 寄存器,我想确保从用户模式到内核模式的转换以及返回到用户模式的转换将保留 XMM 寄存器的状态。 MSDN link读到: In 6
有没有办法将压缩双字整数从 XMM 寄存器推送到堆栈?然后在需要时将其弹出? 理想情况下,我正在为通用寄存器寻找 PUSH 或 POP 之类的东西,我已经检查过英特尔手册,但我要么错过了命令,要么没有
是将值移动到 xmm 寄存器的唯一方法,首先将值移动到整数寄存器中,不知道它们叫什么,然后进入 xmm 寄存器,例如 mov [eax], (float)1000 ; store to mem
如何仅访问 128 位 xmm 寄存器的特定部分(字节)?我必须在整个空间上循环(按字节),逐字节比较并在明确定义的条件下复制它*。 因此,我必须将这个 16 字节寄存器的每个字节与 \0 进行比较,
我在xmm1寄存器加载了一些内容,假设它可以被视为 xmm1 = | bgra | bgra | bgra | bgra | (each one a dw) 现在,我想将每个双字逻辑右移 1 个字节,
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
我想知道,有没有办法增加 xmm 寄存器中的值,或者只能将一个值移到一个寄存器中? 我的意思是,你可以这样做: inc eax 或者像这样: inc [ebp+7F00F000] 有没有办法对 xmm
我需要能够采用 4 个压缩整数,并使用“或”运算将它们(一个在另一个之上)折叠成一个组合整数。 最有效的方法是什么?请注意,打包整数中的 1 永远不会有公共(public)位置,因此我认为无符号“ad
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
使用 nasm 在 x86 汇编中编程... 使用 MOVQ 指令,我将 m64 设置为 xmm MOVQ xmm1, qword [mymem64] 现在我想将它与零进行比较,以便我可以使用 Jcc
给定一个 128 位 xmm包含两个四字(即两个 64 位整数)的寄存器: ╭──────────────────┬──────────────────╮ xmm0 │ ffeeddccbb
我正在开发一个涉及 SSE 内在函数和 XMM 寄存器的项目,并且我想使用提供的所有 16 个寄存器。我试图明确告诉编译器执行此操作,但它似乎不起作用。例如,我可能会写这样一行: register _
我正在尝试使用 GCC 风格的内联汇编将 xmm 寄存器推送到 x86_64 C 代码中的堆栈上。我查看了this的答案问题并正在使用此代码 int main(void) { asm vola
我是一名优秀的程序员,十分优秀!