2011-06-20 3 views
2

Je possède ce bout de code:Delphi prend-il en charge toutes les instructions 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. 

Je reçois cette erreur:

[Pascal Error] SDIMAIN.pas(718): E2003 Undeclared identifier: 'PUNPCKDQ'

que je fais quelque chose de mal, ou ne Delphi 2007 prend pas en charge un ensemble complet d'instructions MMX/SSE?

+3

Pour les mnémoniques que Delphi ne reconnaît pas, vous pouvez utiliser la commande 'DB' pour insérer les octets d'instructions brutes. –

+0

Je ne savais pas Delphi soutenu de telles instructions. Quand a-t-on ajouté du soutien? –

+0

@David: Je suis sûr qu'ils étaient déjà en D7. – Giel

Répondre

3

Delphi 2007 prend en charge les jeux d'instructions MMX et SSE. Certes, Delphi 2010 et XE supportent les jeux d'instructions SSE4.2 (mais jusqu'à présent, aucun support pour AVX). Cependant, Delphi a raison de se plaindre de votre instruction "PUNPCKDQ": Si vous recherchez le Intel® 64 and IA-32 Architectures Software Developer’s Manual (en particulier les volumes 2A et 2B seraient pertinents), vous ne trouverez PAS une instruction de ce nom. C'est à dire, c'est votre erreur, pas le manque de soutien de Delphi pour cette instruction.

+0

Oui, je commence à réaliser que maintenant, je lisais un guide MMX pour rafraîchir ce genre de choses, mais c'est plein de mauvais mots-clés. Très ennuyant. – Johan

4

Un rapide Google donne des informations sur un PUNPCKLDQ plutôt que sur PUNPCKDQ.

D2007 accepte PUNPCKLDQ
et mieux encore, il prend également en charge PUNPCKHDQ, ce qui vous permet de transférer un ordre élevé dword à un faible dword vous permettant de le charger dans un registre à usage général.

+0

Ne me dérange pas mon commentaire précédent, cette instruction a mis les deux mots de commande ** bas ** et les scrabbles, j'ai besoin de brouiller les dwords de haut niveau, pour obtenir ce dword haut «caché» voir :-). PUNPCKHDQ est la réponse. – Johan

+1

Johan, es-tu vraiment en train de dire que la réponse à la raison pour laquelle Delphi ne supporte pas PUNPCKDQ est que toute personne souhaitant l'utiliser devrait vraiment utiliser PUNPCKHDQ ou PUNPCKLDQ à la place? Ce sont trois instructions distinctes avec des effets différents sur leurs opérandes. Je ne vois pas comment cela répond à la question que vous avez posée. –

+0

@Rob, bien c'est ** fait ** répondre à la question, le code avec 'PUNPCKHDQ' travaillé magnifiquement. Peut-être que j'ai regardé la mauvaise instruction, auquel cas je m'excuse. Je ne veux pas dire que les gens devraient utiliser PUNPCKHDQ/... L .. au lieu de n'importe quelle instruction MMX, juste que cela a fonctionné pour moi. – Johan

Questions connexes