ASM: Peut-on utiliser r2 ?
15 sujets de 1 à 15 (sur un total de 28)
- 1
- 2
-
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).
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.[/]
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 [/edit]
…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
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.
(…)
@Crisot: Sous MorphOs aussi .
(Avec l’emu WarpOS)
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
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.
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.
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
Pour info, j’essaye de voir si je ne peux pas optimiser un peu plus les cores RC5 (d’où l’inefficacité de GCC)
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
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 ?