【问题标题】:Does Delphi support all MMX/SSE instructions?Delphi 是否支持所有 MMX/SSE 指令?
【发布时间】:2011-09-19 01:26:21
【问题描述】:

我有这段代码:

@combinerows:
    mov esi,eax
    and edi,Row1Mask
    and ebx,Row2Mask
    or ebx,edi
    //NewQ:= (Row1 and Row1Mask) or (Row2 and Row2Mask);

  //Result:= NewQ xor q;
  PUNPCKDQ mm4,mm5   <-- I get an error here
  //mov eax,[eax].q
  movd eax,mm4

  //q:= NewQ;
  mov [esi].q,ebx
  xor eax,ebx  //Return difference.

我得到这个错误:

[Pascal 错误] SDIMAIN.pas(718): E2003 未声明的标识符:'PUNPCKDQ'

是我做错了什么,还是 Delphi 2007 不支持全套 MMX/SSE 指令?

【问题讨论】:

  • 对于任何 Delphi 无法识别的助记符,您可以使用DB 命令插入原始指令字节。
  • 我不知道 delphi 支持任何这样的指令。何时添加支持?
  • @David:我确定他们已经在 D7 中了。
  • 无论如何,以防万一人们想知道:用movd mm0,ebx 替换push ebx 更慢,而一次性加载两个整数的movq mm4,[eax] 比使用mov ebx,[eax] + mov ecx,[eax+4] 加载两个整数慢使用 mmx 寄存器作为虚拟堆栈确实可以释放 esp 以获得漂亮的东西。那确实起作用了。

标签: delphi delphi-2007 inline-assembly sse mmx


【解决方案1】:

快速的 Google 会提供有关 PUNPCKLDQ 而不是 PUNPCKDQ 的信息。

D2007 接受PUNPCKLDQ
甚至更好的是它还支持PUNPCKHDQ,它可以让您将一个高位双字传输到一个低位双字,使您能够将它加载到一个通用寄存器中。

【讨论】:

  • 别在意我之前的评论,这个指令将两个 low 顺序 dwords 并拼写,我需要打乱高顺序 dwords,才能得到 hidden high双字见:-)。 PUNPCKHDQ 就是答案。
  • Johan,你真的是说为什么 Delphi 不支持 PUNPCKDQ 的答案是任何想要使用它的人都应该使用 PUNPCKHDQ 或 PUNPCKLDQ 代替吗?它们是三个不同的指令,对它们的操作数有不同的影响。我不明白这如何回答您提出的问题。
  • @Rob,它确实回答了这个问题,PUNPCKHDQ 的代码运行良好。也许我查了错误的说明,在这种情况下我道歉。我并不是说人们应该使用 PUNPCKHDQ/...L.. 而不是任何 MMX 指令,只是它对我有用。
【解决方案2】:

Delphi 2007 支持 MMX 和 SSE 指令集。当然,Delphi 2010 和 XE 最多支持 SSE4.2 指令集(但目前不支持 AVX)。

但是,Delphi 抱怨您的“PUNPCKDQ”指令是正确的:如果您搜索 Intel® 64 and IA-32 Architectures Software Developer’s Manual(尤其是第 2A 卷和第 2B 卷),您将找不到该名称的指令。即,这是您的错误,而不是 Delphi 不支持此指令。

【讨论】:

  • 是的,我现在开始意识到,我正在阅读 MMX 指南来复习这些内容,但其中充满了错误的关键字。很烦人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2012-11-25
  • 2011-02-27
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多