【问题标题】:how to make simple float4 add in gcc/mingw inline assembly如何在 gcc/mingw 内联汇编中添加简单的 float4
【发布时间】:2014-12-04 09:07:39
【问题描述】:

我可能需要在奇怪的 GCC 内联汇编中得到类似的东西

void add4(float* a, float* b, float* out) 
{ 
  mov edx, [esp+4] 
  movaps  xmm0, oword [edx+0]   
  mov edx, [esp+8] 
  movaps  xmm1, oword [edx+0]   
  addps  xmm0, xmm1 
  mov edx, [esp+12] 
  movaps oword [edx+0], xmm0 
  ret 
} 

1) 一个主题是如何将其打包成 gcc 内联语法 2)第二个主题是如何重写它(也许摆脱显式内存访问) 使这样的内联例程与周围的 GCC (mingw32) 代码很好地集成

【问题讨论】:

  • 您是否考虑过使用 gcc 向量类型并让编译器为您完成所有工作?
  • 不要使用内联汇编,而是使用内在函数。

标签: c gcc assembly x86 mingw


【解决方案1】:

有两种方法可以做到这一点。

第一种方法是使用asm 关键字将内联汇编包含为文字字符串。你也可以传入函数参数,GCC 会生成必要的代码来访问它们。这将使您不必手动使用内存访问,尤其是在处理不同的调用约定时。这是在 C 函数中嵌入汇编的一般方法。

第二种方法,更具体到你想要做什么,是使用 SSE 内在函数(由<xmmintrin.h> 提供。生成的代码看起来像普通的 C 函数调用,但编译器会生成相应的指令而不是一堆函数调用。有关如何使用这些内在函数的更多信息,请参阅Intel Intrinsics Guide

【讨论】:

  • 但是在内联 gcc 程序集中它到底需要查看什么?
  • 在您的情况下,只需将每一行汇编代码放在引号中(您还需要在每个字符串的末尾插入文字 \n),然后将整个内容包装在 @987654325 @ 和 );。如果您需要示例,我可以编辑我的回复。
  • 需要一个例子还有这个奇怪的结尾 asm ("movl %1, %%eax; :"=r"(b) /* output / :"r"(a) / 输入 / :"%eax" / 破坏寄存器 */ );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多