Mon premier programme en assembleur RISC-V
Avec beaucoup de retard, puisqu’on t’a proposé des améliorations, j’y vais aussi de la mienne. Elle repose essentiellement sur ta remarque : Un accès mémoire, en 2021, c’est le temps de 100 à 200 instructions.
Dans ta dernière version, les deux premières instructions de la boucle principale sont deux accès mémoire, le second étant dépendant du premier, il ne peut s’exécuter que quand le premier est terminé et que l’octet souhaité est donc bien présent dans x28. L’exécution de la deuxième instruction reste donc bloquée le temps d’un accès mémoire. Vu l’architecture pipe-line, il n’est pas clair que ça bloque aussi les suivantes, mais on a plus de chances que ça marche si les instructions qui suivent la première ne nécessitent pas la présence de l’octet dans x28.
Je suggère donc de remonter les 2 instructions d’incrémentation "addi x12, x12, 1" et "addi x13, x13, 1" entre le "lbu" et le "sb". Evidemment, comme entre temps x13 a été incrémenté, la dernière devient "sb x28, -1(x13)".
Il semble d’ailleurs, d’après la réponse de Michel Billaud, que le compilateur C soit adepte de cette stratégie, mais pas à fond, puisqu’il insère une incrémentation entre les deux accès alors qu’il aurait pu en caser deux. Je ne comprends pas bien sa remarque sur les pointeurs sur les précédents, de toute façon l’addition du déplacement au registre d’adresse s’effectue, elle prend le même temps, que le déplacement soit positif, négatif ou nul.
Robert, je savais que je pouvais m’attendre de ta part à une lecture attentive et à des corrections. Merci !