2011-06-20 51 views
2

我有這樣的代碼片段:Delphi是否支持所有的MMX/SSE指令?

@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 Error] SDIMAIN.pas(718): E2003 Undeclared identifier: 'PUNPCKDQ'

上午我做錯了什麼,還是2007年德爾福不支持全套的MMX/SSE指令?

+3

對於Delphi無法識別的任何助記符,可以使用'DB'命令插入原始指令字節。 –

+0

我不知道delphi支持任何這樣的說明。什麼時候增加了支持? –

+0

@David:我確定他們已經在D7了。 – Giel

回答

3

Delphi 2007支持MMX和SSE指令集。當然,Delphi 2010和XE支持SSE4.2指令集(但迄今爲止不支持AVX)。

但是,德爾福是正確的抱怨您的「PUNPCKDQ」指令:如果您搜索Intel® 64 and IA-32 Architectures Software Developer’s Manual(特別是卷2A和2B將是相關的),您將不會找到該名稱的指令。即,這是你的錯誤,而不是德爾福對這條指令的支持。

+0

是的,我開始意識到,現在,我正在閱讀MMX指南來刷新這個東西,但它充滿了錯誤的關鍵字。很煩人。 – Johan

4

快速Google提供有關PUNPCKLDQ而非PUNPCKDQ的信息。

D2007接受PUNPCKLDQ
,甚至更好它也支持PUNPCKHDQ,它可以讓你高階DWORD轉移到低DWORD使您能夠將其加載到通用寄存器。

+0

沒關係我以前的評論,這個指令把兩個**低**順序的雙字並且對它們進行拼寫,我需要對高階雙字進行爭奪,以獲得那個「隱藏」的高雙字符:-)。 PUNPCKHDQ就是答案。 – Johan

+1

Johan,你真的在​​說,爲什麼Delphi不支持PUNPCKDQ的答案是,任何想使用它的人都應該真的使用PUNPCKHDQ或PUNPCKLDQ?它們是三個不同的指令,對它們的操作數有不同的影響。我不明白這是如何回答你問的問題。 –

+0

@Rob,它**做了**回答這個問題,使用'PUNPCKHDQ'的代碼工作得很好。也許我查了一下錯誤的指示,在這種情況下我很抱歉。我不是故意說人們應該使用PUNPCKHDQ/... L ..而不是任何MMX指令,只是它對我有用。 – Johan

相關問題