如何让`gcc`从标准C生成x86-64的`bts`指令?

受最近一个问题的启发,我想知道是否有人知道如何让gcc在Linux x86-64平台上生成x86-64 bts指令(位测试和设置), 而无需求助于内联汇编或非标准编译器内部函数。

相关问题:

  • 为什么gcc没有为简单的|=操作执行此操作,右侧是否正好设置了1位?

  • 如何使用编译器内在函数或asm指令获取bts

可移植性对我来说比bts更重要,所以我不会使用和asm指令,如果有另一个解决方案,我宁愿不使用编译器instrinsics。

编辑 :C源语言不支持primefaces操作,所以我对获得primefaces测试和设置并不特别感兴趣(尽管这是测试和设置首先存在的原始原因)。 如果我想要一些primefaces,我知道我没有机会使用标准C源:它必须是内在的,库函数或内联汇编。 (我在支持multithreading的编译器中实现了primefaces操作。)

这是第一个环节的第一个答案 – 在宏观方案中有多重要。 测试位时唯一的部分是:

  • 低级别的司机。 但是,如果你正在编写一个你可能知道ASM的系统,那么系统就足够了,并且可能大多数延迟都在I / O上
  • 测试标志。 它通常在初始化时(仅在开始时一次)或在某些共享计算上(需要更多时间)。

即使微基准测试显示出改进,对应用程序和宏基准测试的性能的总体影响也可能很小。

对于编辑部分 – 单独使用bts并不能保证操作的primefaces性。 它保证的是它在这个核心上是primefaces的(在内存上也是如此)。 在多处理器单元(不常见)或多核单元(非常常见)上,您仍然需要与其他处理器同步。

由于同步更加昂贵,我相信以下两者之间的区别:

 asm("lock bts %0, %1" : "+m" (*array) : "r" (bit)); 

 asm("lock or %0, %1" : "+m" (*array) : "r" (1 << bit)); 

很小。 第二种forms:

  • 可以一次设置几个标志
  • 有一个很好的__sync_fetch_and_or (array, 1 << bit)forms(据我记得,在gcc和intel编译器上工作)。

我使用gccprimefaces内置__sync_lock_test_and_set例如__sync_lock_test_and_sethttp://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html )。 更改-march标志将直接影响生成的内容。 我现在正在使用i686 ,但http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options显示全部可能性。

我意识到这并不是你要求的,但是当我在寻找这样的机制时,我发现这两个网页非常有用。

我相信(但不确定)C ++或C标准都没有针对这些类型的同步机制的任何机制。 对更高级别同步机制的支持处于各种标准化状态,但我甚至认为其中一个不允许您访问您所遵循的原语类型。

您是否正在编写锁定不足的无锁数据结构?

您可能希望继续使用gcc的非标准扩展和/或操作系统或库提供的同步原语。 我敢打赌,如果您担心使用编译器内在函数,那么可能会提供您正在寻找的可移植性类型的库。 (虽然真的,我认为大多数人只是咬紧牙关并在需要时使用特定于gcc的代码。不理想,但标准并没有真正跟上。)