将 `movss xmm0, cs:dword_5B27420` 替换为 `movss xmm0, immediate`

Replace `movss xmm0, cs:dword_5B27420` with `movss xmm0, immediate`

我在 Ida Pro 中有一个 linux.so 文件,我有以下指令:

movss   xmm0, cs:dword_5B27420

是否可以使用与该指令相同或更少的字节数将固定值移动到 xmm0

指令字节为:

F3 0F 10 05 C8 BB A 00

我想做类似的事情:

movss   xmm0, 0.3

字节数不多;如果这里没有空间,则必须跳到其他地方然后返回,或者只是更改 RIP-relative 地址以从其他地方加载不同的常量。 (例如,从两个函数之间进行填充,或者在 .rodata 或 .data 中保留 space,如果有的话。)

XMM 寄存器没有 mov-immediate,mov eax, __?float32?__(0.3)(5 字节)/movd xmm0, eax(4 字节)将占用更多字节。 (整数值 是给定 FP 常量的 bit-pattern。某些汇编程序可能允许 mov eax, 0.3,以防万一。)

除立即数以外的构造 FP 常量的方法包括 pcmpeqd xmm0,xmm0(4 个字节),然后使用 all-ones 位模式进行移位或做其他事情(如 pabsd)。但这至少是 2 条指令,除非你想要一个 NaN。 (参见 Agner Fog's optimizing asm guide, and

0.3f 不是一个简单的常量,您甚至可以在 0xffffffff 的 3 条指令中实现左右移位,这与 1.0f 不同。 (但这仍然是三个指令,每个 4 和 5 个字节来构造 set1(1.0f))

cmpps 是 SSE1 non-scalar,所以它的操作码比 pcmpeqd 小(没有强制性前缀,只有 0f c2),但总体上并没有更小,因为比较谓词需要立即数。