Gcc 错误:输出操作数中的匹配约束无效

Gcc 错误:输出操作数中的匹配约束无效,gcc,inline-assembly,powerpc,altivec,Gcc,Inline Assembly,Powerpc,Altivec,我很难让GCC内联汇编程序接受Power9的一些内联汇编 我试图让GCC接受的常规程序集是darn 3,1,其中3是r3,1是文档中称为L的参数。它在big endian上分解为: 0: e6 05 61 7c darn r3,1 关于小恩迪安: 0: 7c 61 05 e6 darn r3,1 由于各种原因和问题,包括旧编译器和冒充其他编译器的编译器,我想为指令发出字节码。我的测试程序: gcc112:~$ cat test.c #include <s

我很难让GCC内联汇编程序接受Power9的一些内联汇编

我试图让GCC接受的常规程序集是darn 3,1,其中3是r3,1是文档中称为L的参数。它在big endian上分解为:

0:   e6 05 61 7c    darn    r3,1
关于小恩迪安:

0:   7c 61 05 e6    darn    r3,1
由于各种原因和问题,包括旧编译器和冒充其他编译器的编译器,我想为指令发出字节码。我的测试程序:

gcc112:~$ cat test.c
#include <stdint.h>

void random()
{
  volatile uint64_t x = __builtin_darn();

  __asm__ __volatile__ ("darn 3, 1");

  uint64_t y;
  __asm__ __volatile__ (".byte 0x7c, 0x61, 0x05, 0xe6  \n" : "=r3" (y));
}
下面是GCC内联汇编手册中应该介绍它的部分,但我没有看到它的扩展:。我还检查了简单约束和机器约束,但没有看到它

我如何告诉GCC执行指令,然后将r3移到y

我们在x86上使用rdrand做同样的事情。它在GCC的所有版本上都可以正常工作,可以追溯到2.9:

uint64_t temp;
__asm__ __volatile__
(
    // radrand rax with retry
    "1:\n"
    ".byte 0x48, 0x0f, 0xc7, 0xf0;\n"
    "jnc 1b;\n"
    : "=a" (temp)
    : : "cc"
);
将我未经测试的评论移动到一个答案,试图结束此问题

我不熟悉r3作为输出约束。我猜这是为了表明输出将在“r3”寄存器中,但我不认为您可以这样做,尽管我不是powerpc的专家。相反,您可以尝试:

register uint64_t y asm("r3");

ie将y设为a,然后使用=r作为约束?

我不熟悉r3作为输出约束。我猜这是为了表明输出将在“r3”寄存器中,但我不认为您可以这样做,尽管我不是powerpc约束方面的专家。也许您可以尝试注册uint64\u t y asmr3;ie a,然后只使用=r作为约束?可能的重复,我发布了与@David基本相同的寄存器asm局部变量答案。谢谢David。我尝试了register-local和指向register-local的指针,但都不起作用。两者都导致了一个疯狂的写入,导致程序出错。拆卸显示发生了两次存储。这就是为什么我想让=r3按预期工作的原因,我认为这是不可能的。从的输出来看,我看到了与使用本地寄存器相同的内置数据的结果。如果有一个野生指针,我不相信它来自这个代码。您是否删除了“额外”asm?darn 3,1;?该代码无效,因为它在未通知编译器的情况下覆盖了r3。
register uint64_t y asm("r3");