ASM: Peut-on utiliser r2 ?

15 sujets de 1 à 15 (sur un total de 28)

  • 1
  • 2
  • kakace

      #1386

      Est-il possible d’utiliser le registre r2 dans une fonction (leaf procedure) sans perturber les ABI MorphOS ou AmigaOS, et si oui, y-a-t’il des précautions particulières à prendre ?

      En d’autres termes, j’ai besoin de savoir si je dois prévoir une version particulière pour MorphOS/AmigaOS d’un code ASM développé pour Mac OS X (où l’utilisation de r2 est libre).

      krabob

        #32075

        heu… c’est la Table Of Content (toc) r2, elle pointe des données globales.normalement faut pas la bouger. mais tu peux avoir un context switch meme dans une leaf… remarque , meme dans ce cas on doit pouvoir changer r2, Mais dans tout les cas, r2 doit avoir la meme valeur en sortie de ta fonction qu’en entrée.

        [edit]et non, pas de toc en abi system5, perdu.[/]

        Yomgui

          #32076

          Non!

          car r2 est aussi utilisé dans les exceptions… or ton code peut-être interrupté par une exception… qui plantera car tu auras modifé r2…!

          [edit]@krabob: rapide le bougre! pourtant j’ai clické vite sur “valider” ! Mais bon… ma réponse est meilleure que la tienne :-P[/edit]

          krabob

            #32077

            …et pour confirmer, l’aBI systemV, utilisé donc par amigaos4 et mos dit:

            http://refspecs.freestandards.org/elf/elfspec_ppc.pdf

            …Register r2 is reserved for system use and should not be changed by application code….

            r0 Volatile register which may be modified during function linkage

            r1 Stack frame pointer, always valid

            r2 System-reserved register

            r3-r4 Volatile registers used for parameter passing and return values

            r5-r10 Volatile registers used for parameter passing

            r11-r12 Volatile registers which may be modified during function linkage

            r13 Small data area pointer register

            r14-r30 Registers used for local variables

            r31 Used for local variables or “environment pointers”

            f0 Volatile register

            f1 Volatile register used for parameter passing and return values

            f2-f8 Volatile registers used for parameter passingf9-f13 Volatile registers

            f14-f31 Registers used for local variables

            CR0-CR7 Condition Register Fields, each 4 bits wide

            LR Link Register

            CTR Count Register

            XER Fixed-Point Exception Register

            FPSCR Floating-Point Status and Control Register

            Yomgui

              #32078

              et je dirait même mieux:

              de “DocumentationArticlesPorting/MorphOS.txt”:

              (…)

              Register r2, the EmulHandle pointer must never be killed by any application anytime. This conforms to the System V4 ABI which declares r2 as reserved for system. Changing this pointer would mean that following PPC emulation calls wouldn’t be possible and that the whole emulation would crash on the next interrupt. This is the same as using an invalid A7 register in the ABox environment.

              (…)

              anonyme

                #32079

                ‘Soir.

                L’utilisation de R2 sous OS4 est possible.

                ‘Bye.

                /me qui maintenant utilise R2 dans tout son code.

                anonyme

                  #32080

                  @Crisot: Sous MorphOs aussi :-P.

                  (Avec l’emu WarpOS)


                  @kakace
                  :

                  Le MacOS X utilise l’ABI PowerOpen (si je me rapelle bien),et le reste

                  du monde (MorphOs, Linux…) l’ABI SysV.

                  Ceci dis. Tu peux utiliser Gcc pour faire du code asm “compatible”

                  avec les deux ABI. -> C’est Gcc qui s’occupe de choisir les registres.

                  Bye

                  anonyme

                    #32081

                    Nico: WarpOs ne permet pas d’utiliser R2.

                    dommage…

                    anonyme

                      #32082

                      @Humm, en effet, PowerOpen dis “r2 table of contents register”

                      Mais, c’est peut-etre “trashable” avec l’implemantation de MorphOs.

                      En tout cas, c’est mal d’utiliser r2 :-P

                      anonyme

                        #32083

                        Nico: J’ai testé également: Sous WarpOs le trash de R2 fige immédiatement la machine, meme si l’instruction suivante est son restaure: Ca ne marche pas.

                        Si MorphOs utilise R2 à très bas niveau, il est hélas impossible de le faire utiliser par une application, un wrapper, etc… Tu n’a qu’à demander à ITIX ce qu’il en pense.

                        Utiliser R2 n’est pas mal, tant que c’est toléré par l’Os… a moins que tu ne sois en train de me dire qu’Os X soit mal branlé, mais là, tu t’engage personnellement contre plusieurs millions de fans.

                        anonyme

                          #32084

                          Utiliser R2 n’est pas mal, tant que c’est toléré par l’Os… a moins que tu ne sois en train de me dire qu’Os X soit mal branlé, mais là, tu t’engage personnellement contre plusieurs millions de fans.

                          Utilisez R2 c’est mal car la doc dis de pas la faire…

                          Même si ca marche sur un OS donnée, tu fais du code moins portable.

                          Il faudrait mieux utiliser l’interface de gcc pour ce genre de chose.

                          kakace

                            #32085

                            Ok, vous fâchez pas ! :-)

                            Le fait est que r2 n’est pas utilisé sous Mac OS X (pas de TOC), et est donc libre d’emploi (documenté comme tel). Je sais que d’autres ABI réservent ce registre pour pointer la TOC. Dans ce cas de figure, comme il s’agit d’une leaf procedure n’ayant aucun besoin de cette TOC, on peut imaginer pouvoir utiliser ce registre (à condition de sauvegarder son contenu).

                            D’un autre côté, ce même registre étant explicitement documenté comme étant réservé pour le système (par ces ABI), j’ai vite pensé qu’une interruption pouvait en avoir besoin, d’où un conflit d’interêt.

                            Quoiqu’il en soit, GCC n’est pas la réponse. Il s’agit de code ASM écrit à la main de façon à être le plus performant possible (GCC est totalement incapable de générer un code aussi efficace, et de loin). Je vais donc envisager une version n’utilisant pas r2, mais elle sera un poil moins performante 8-)

                            Pour info, j’essaye de voir si je ne peux pas optimiser un peu plus les cores RC5 (d’où l’inefficacité de GCC)

                            anonyme

                              #32086

                              @kakace:

                              Même l’asm inline de Gcc ne ferai pas bon office ?

                              Tu pense que c’est plus lent que de l’asm pur et dure écris à la main?

                              Bon courage, pour ton optimisation de RC5 :-)!

                              Bye

                              anonyme

                                #32087

                                Par ASM écrit à la main il parlait de code non généré par GCC. Evidement, de l’ASM inline GCC vas tout aussi vite que de l’asm compilé par autre chose, une fois qu’on est dans le “asm()”.

                                Encore que… J’ai remarqué que le inline de GCC avait tendance à planter dés qu’on lui laisse moins de 2 registres de libre, ce qui est relativement génant, j’ai été énormément confronté au problème, alors Kakace je vous en parle meme pas (ou alors son compilo est mieu branlé, ce qui n’est d’ailleur pas compliqué).

                                Et non, il vas pas “utiliser un autre registre”, vu que connaissant kakace, si il utilise R2, c’est que les 31 autres sont morts depuis un moment :-)

                                krabob

                                  #32088

                                  ouai quand meme, en 68000 je comprend qu’on est besoin de grapiller des registres, mais si 29 ou 30 trente registres entier et 32 float ne vous suffisent pas, posez vous des questions, ya un probléme dans votre algo.

                                  C’est pas un registre de plus qui fera bourrer quoi que ce soit en ppc.

                                  Plutot que de sauver un misérable registre, sauver des cachelines et aligner vos struct, mettez les champs en lecture sur un CL et ceux en écriture sur un autre CL ! ça, c’est vraiment effectif pour du PPC.

                                15 sujets de 1 à 15 (sur un total de 28)

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

                                Forums AmigaOS, MorphOS et AROS Développement ASM: Peut-on utiliser r2 ?

                                Amiga Impact