GCC et MOVEM

4 sujets de 1 à 4 (sur un total de 4)

  • thellier

      #6855

      Bonjour

      Existe il une syntaxe en C qui fasse générer un MOVEM dans le binaire ASM 680X0 ?

      Pour par exemple copier 4 valeurs en mémoire en une seule instruction

      MERCI

      Alain

      seg

        #109734

        Je crois que c’est un truc comme ca sur GCC:

        D’abord, definis toi ce define pour te simplifier la vie:

        #define ASMOPT(code) {__asm__ __volatile__(code: : : “cc”);return;}

        Puis, dans ton code:

        ASMOPT(“movel d1,d0; subqw #2,d0”);

        (Il s’agit d’un exemple bidon).

        Attention, c’est de la syntaxe MIT, pas MOT! J’en sais pas plus. C’est un ami qui m’avait montré ca et je n’utilise pas Gcc sur Amiga.

        Je te conseille de chercher un peu plus d’infos sur google.

        a+

        [EDIT] Je pense que j’ai mal compris ta question. En fait, je ne connais pas de syntaxe C qui fasse ce que tu demandes. Il faut, a mon avis, que tu forces ton code Asm a l’endroit ou tu en as besoin.

        thellier

          #109735

          Effectivement c’est pas vraiment ce que je demandais mais c’étais sympa de répondre :-)

          Le problème d’inclure de l’assembleur comme tu fais c’est qu’on assume utiliser D0

          Or ce registre peut déjà être utilise par le compilo à ce moment

          L’idéal serait qu’une syntaxe C comme

          register LONG x,y,z,w;

          LONG *t;

          *t++=x;

          *t++=y;

          *t++=z;

          *t++=w;

          devienne une seule instruction asm : un MOVEM de d0-d3

          A y réfléchir ta méthode peut marcher si on utilise la syntaxe Amiga-GCC qui fixe un registre particulier pour une variable

          le problème c’est que ça bloque ces 4 registres sur ces 4 variables qui servent vraiment que pour la copie du movem

          Alain

          corto

            #109736

            La syntaxe de l’assembleur inline n’est pas très simple et surtout très mal documenté, dès qu’on sort un peu du x86 et de l’ARM.

            Voici ce que j’ai trouvé :

            int t1,t2,t3,t4;

            asm volatile (“moveml %1/%2/%3/%4,%0@-“

            : “=a” (out), “=d” (t1), “=d” (t2), “=d” (t3), “=d” (t4)

            : “1” (0), “2” (0), “3” (0), “4” (0), “0” (&stack[4]));

            Dans ce cas, il semble que 4 registres soient chargés depuis la pile.

            Je te conseille de faire des essais et de voir le code généré. Je me demande si l’exemple si dessus ne devrait pas indiquer au compilo que le contenu des registres a été modifié. Ou alors le fait qu’ils soient marqués comme “=d” suffit …

          4 sujets de 1 à 4 (sur un total de 4)

          • Vous devez être connecté pour répondre à ce sujet.

          Forums AmigaOS, MorphOS et AROS Développement GCC et MOVEM

          Amiga Impact