小编Bee*_*ope的帖子

从GP regs加载xmm

假设你有值rax,rdx你想加载到xmm寄存器中.

一种方法是:

movq     xmm0, rax
pinsrq   xmm0, rdx, 1
Run Code Online (Sandbox Code Playgroud)

虽然这很慢!有没有更好的办法?

x86 assembly sse simd micro-optimization

3
推荐指数
1
解决办法
224
查看次数

有没有办法判断SMM中断发生了?

有没有办法从用户空间确定,对于某些以编程方式定义的间隔,当前核心上是否发生了SMM条目?

hardware x86 intel

3
推荐指数
1
解决办法
1797
查看次数

使一个寄存器依赖于另一个寄存器而不改变其值

考虑以下 x86 程序集:

; something that sets rax
mov rcx, [rdi]
xor rax, rcx
xor rax, rcx
Run Code Online (Sandbox Code Playgroud)

在序列末尾,rax的值与进入时的值相同,但从 CPU 的角度来看,它的值取决于从内存加载到 的值rcx。特别是,rax在该加载和两条指令完成之前,后续的使用不会开始xor

有没有什么方法可以比双xor序列更有效地实现这种效果,例如,使用单个单微指令单周期延迟指令?如果某个常量值需要在序列之前设置一次(例如,有一个归零的寄存器),这是可以的。

performance x86 assembly micro-optimization microbenchmark

3
推荐指数
1
解决办法
355
查看次数

连续截断整数除法可以用乘法替换吗?

在具有有理数的小学数学中,表达式(a / b) / c相当于a / (b * c)基本的代数操作.

/在C和大多数其他语言中截断整数除法时是否相同?也就是说,我可以用所有除数的乘积用一个除法代替一系列的除法吗?

你可以假设乘法不会溢出(如果是的话,显然它们不是等价的).

c math division integer-division

3
推荐指数
1
解决办法
104
查看次数

x86 non-mov指令具有只写目标并且可以在Intel的任何端口上运行?

是否有任何整数2操作数x86-64指令将其第一个操作用作目标,而不用作源+目标1或仅源2,并且p0156在Intel Haswell和/或更高版本的CPU上运行?

mov指令不感兴趣,即mov名称中的任何内容。

例如,BMI1 blsi eax, edx是2操作数,目标​​为只写,但只能在Skylake的端口1或端口5上执行。


1大多数指令都属于此类,例如,add eax, ebx代表eax = eax + ebx

2少数2个操作数整数指令仅将其第一个操作数用作源,例如cmp eax, ebx

x86 assembly x86-64 intel cpu-architecture

3
推荐指数
1
解决办法
123
查看次数

在声明中使用不一致的 noexcept 是否违反 ODR?

这是一个两部分的问题,第一部分是关于完全用 C++ 编写的东西,第二部分是关于用 C 编写但从 C++ 调用的函数之间的交互。

第1部分

让不同的翻译单元noexcept在同一函数的声明中看到不同的说明符是 ODR 还是其他违规行为?具体来说,如果一个单位看到:

void foo();
Run Code Online (Sandbox Code Playgroud)

而另一个人看到:

void foo() noexcept;
Run Code Online (Sandbox Code Playgroud)

这是 ODR 还是其他违规行为?您可能会假设该函数实际上永远不会抛出(即,它实际上可以被声明noexcept)。

第2部分

如果所有 C++ 代码都将声明视为extern "C" void foo() noexcept;,但该函数实际上是在 C 中定义(实现)的,其中声明(显然)不包含noexcept?

c c++ one-definition-rule language-lawyer noexcept

3
推荐指数
1
解决办法
120
查看次数

x86 MSR 名称的 IA32 与 MSR 前缀

Intel 有时使用MSR_MSR 名称的前缀,有时IA32_甚至对于相同的 MSR 也使用 。

例如,在 SNB 上,在SDM 第 4 卷中,它们记录了IA32_PERF_STATUSMSR_PERF_STATUS对于 MSR 0x198,其位值有些不同(但不完全不一致1):

英特尔 SDM 卷。 4

那是怎么回事?


1在版本中定义为保留的IA32位在版本中被赋予特定含义MSR

x86 intel msr

3
推荐指数
1
解决办法
694
查看次数

可以直接计算这个奇怪的功能吗?

我想直接计算这个函数,但到目前为止,这个技巧已经躲过了我:

uint8_t distance(uint64_t a, uint8_t b) {
    // a and b both odd, a at least as large as b 
    assert((a & 1) && (b & 1) && a >= b);  
    // really dumb, keep subtracting 2 until you hit a multiple of b
    uint64_t distance = 0;
    while (a % b != 0) {
        distance++;
        a -= 2;
    }
    assert(distance <= 255);
    return (uint8_t)distance;
}
Run Code Online (Sandbox Code Playgroud)

基本上,返回值是a必须将2减少多少次才能成为的倍数b.这应该是最终的(没有环绕或任何奇怪的),因为a并且b是奇怪的a >= b.

如果它是"递减1"而不是2,答案就会很简单 …

c math optimization

2
推荐指数
1
解决办法
99
查看次数

应该在64位x86中对指针比较进行签名还是不签名?

在编写x86-64用户空间程序集并比较两个指针值时,我们应该使用带符号的条件(例如jl和)jge还是使用无符号的条件(例如jb和)jae

直觉上,我认为指针是无符号的,在64位进程的情况下,指针从0到2 ^ 64-1,并且我认为该模型对于32位代码是准确的。我想这就是大多数人对他们的看法。

但是,在64位代码中,我认为您无法有效地跨越0x7FFFFFFFFFFFFFFF(2 ^ 63-1)处的有符号不连续性,并且许多有趣的内存区域倾向于聚集在有符号0附近(对于代码和静态数据,有时甚至是有时)堆的大小取决于实现),并且0x00007fffffffffff在某些实现1的堆栈地址和堆附近接近规范地址空间下半部分的最大地址(类似于当今的大多数系统)。

因此,我不确定应该采用哪种方式对待它们:带符号的优点是它在0附近是安全的,因为那里没有间断;而无符号的优点是在2 ^ 63附近,因为那里没有间断。但是实际上,您不会在2 ^ 63附近看到任何地址,因为当前商用硬件的虚拟地址空间限制为小于50位。这是否指向签名?


1 ...,有时堆和其他映射区域不靠近地址空间的底部或顶部。

x86 assembly pointers x86-64

2
推荐指数
1
解决办法
285
查看次数

是否保证字节方式的零 int 是零的表示?

特别是,assert保证以下内容成立:

int i;
memset(&i, 0, sizeof(int));
assert(i == 0);
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
89
查看次数