2009-06-30 6 views
2

Je lis les différents sujets qui traitent de ce genre de problème, mais je n'ai toujours pas de réponse. Voici mon problème:iphone dev: problème avec inline asm

Dans mon fichier d'en-tête, j'ai ceci:

int cl, ch, _a = a, _b = b;\ 
    __asm__ ("smull %0, %1, %2, %3\n"   
    "mov %0, %0, lsr %4\n"   
    "orr %0, %0, %1, lsl %5\n"   
    : "=&r" (cl), "=&r" (ch)   
    : "r" (_a), "r" (_b), "i" (r), "i" (32-(r))); 
    cl; }) 

Dans mes paramètres du projet, je l'ai vérifié que ces options suivantes ont été ckecked link text

Mais j'ai une console erreur:

{entrée standard}: 242: processeur sélectionné ne supporte pas - smull r0,r1,r2,r3' {standard input}:244:unshifted register required -- orr r0, r0, r1, LSL # 20'

Pourriez-vous m'aider?

Répondre

3

Compilez-vous le fichier pour arm? Par défaut, le code pour l'iPhone est compilé pour le pouce (ce qui est généralement préférable, sauf si vous faites des calculs en virgule flottante). L'ASM que vous avez listé est arm. Vous devrez définir tout fichier qui utilise cet en-tête pour compiler en tant qu'arm, car GCC ne vous permet pas de changer de backend dans une seule unité de compilation. Vous pouvez le modifier en désélectionnant «Compiler pour le pouce» sous «Génération de code GCC 4.x».

La compilation de l'intégralité de votre projet en tant que bras aura probablement un impact significatif (négatif) sur l'utilisation de la mémoire et sur les performances du proxy. Y compris ASM via une macro dans un en-tête comme ça va s'avérer très salissant sur l'iPhone. En général, il vaut mieux mettre tous vos ASM dans un seul fichier et compiler ce fichier comme un bras, mais pour ce qui est seulement une séquence d'instructions qui ne vaudra probablement pas non plus.

Questions connexes