Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让ARM MULL指令在gcc中的uint64_t中生成其输出?_Gcc_Assembly_Arm_32bit 64bit - Fatal编程技术网

如何让ARM MULL指令在gcc中的uint64_t中生成其输出?

如何让ARM MULL指令在gcc中的uint64_t中生成其输出?,gcc,assembly,arm,32bit-64bit,Gcc,Assembly,Arm,32bit 64bit,我想在c99代码库中引入一些汇编代码。我想使用ARM CPU的UMULL指令将2个uint32_t相乘,并将结果立即输入uint64_t 现在一个uint64需要2个寄存器,那么如何指定asm块的输出和约束?指令将其结果生成两个32位寄存器。我建议显式地重新组合64位值,如下所示: /* assuming the 64-bit result was stored in "hi" (upper half) and "lo" (lower half) */ uint64_t v = ((uin

我想在c99代码库中引入一些汇编代码。我想使用ARM CPU的UMULL指令将2个uint32_t相乘,并将结果立即输入uint64_t


现在一个uint64需要2个寄存器,那么如何指定asm块的输出和约束?

指令将其结果生成两个32位寄存器。我建议显式地重新组合64位值,如下所示:

/* assuming the 64-bit result was stored in "hi" (upper
   half) and "lo" (lower half) */
uint64_t v = ((uint64_t)hi << 32) | (uint64_t)lo;
/*假设64位结果存储在“hi”(上限)中
一半)和“lo”(下半部分)*/
uint64_t v=((uint64_t)hi问得好

以下代码使用
GCC-O
或更高版本输出所需内容,而无需借助汇编程序: uint32_t a,b; uint64_t c; ... c=(uint64_t)a*(uint64_t)b; 或者,如果您觉得必须使用特定于机器的asm,您可以: uint32_t a,b; uint64_t c

asm(“umull%Q0、%R0、%1、%2”:“=r”(c):“r”(a),“r”(b));
c
的寄存器名是寄存器对的第一个,并且%Q和%R选择寄存器对的上下32位寄存器。有关示例,请参阅gcc/config/arm/arm.md->umulsid3


但是,如果您可以继续使用C,那么优化器就有机会做更多的事情,并且对您的程序的读者更友好。

谢谢您的回答!事实上,C版本做了我希望它做的事情,非常酷。非常感谢%Q和%R语法,这正是我一开始想要的。 uint32_t a, b; uint64_t c; ... c = (uint64_t)a * (uint64_t)b; uint32_t a, b; uint64_t c;

asm ("umull %Q0, %R0, %1, %2" : "=r"(c) : "r"(a), "r"(b));