GCC et MOVEM

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

  • thellier

    • Messages : 668
    #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

    • Messages : 1134
    #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

    • Messages : 668
    #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

    • Messages : 1129
    #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,%[email protected]« 

    : « =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

Do NOT follow this link or you will be banned from the site!