Architectures Logicielles et Matérielles
etat Sur certains processeurs, on peut trou- ver des instructions qui combinent un test et un branchement. Par exemple, le processeur mips r10000 fournit une instruction qui combine un test et un branchement conditionnel sur les entiers. La condition est soit l’´eenne A = B avant d’effectuer un branchement, si les deux entiers sont dans des registres. On ´a un sous-programme, avec sauvegarde de l’adresse de d´erons le programme suivant, dans lequel JSR est une intruction de saut `ecution de JSR provoque un branchement (donc une rupture de s´e par le programmeur.
Sauts `a des sous-programmes Enfin tous les processeurs fournissent un moyen de trans ´erer le contrˆole ` epart, pour reprendre le flot normal des instructions quand le sous programme se termine.Consid´ a un sous-programme, RTS est l’instruction de retour de sous-programme et Inst-i d´enote une instruction de calcul quelconque (ne provoquant pas de rupture de s´equence). JSR a comme op´erande une ´etiquette qui d´esigne le sous-programme ; l’ex´ equence) au sous-programme d´esign´e avec sauvegarde de l’adresse qui suit l’instruction JSR. L’instruction RTS provoque un retour de sous-programme c’est-`a-dire un branchement `a l’adresse qui avait ´et´e pr´ec´edemment sauvegard´ee. En cas de branchements successifs `a des sousprogrammes, les adresses de retour doivent ˆetre g´er´ees en pile.
(instruction RTS). Lors du premier appel (ex´ecution de JSR SP1) l’adresse sauvegard´ee est 3 ; l’ex´ecution de l’instruction RTS effectue le retour `a cette adresse. L’instruction de branchement avec sauvegarde de l’adresse de d´epart est g´en´eralement sp´ecifique : il s’agit d’une instruction de branchement qui n’est pas ordinaire puisqu’il lui faut int´egrer une sauvegarde. Or apr`es le saut il est trop tard pour sauvegarder l’adresse d’o`u l’on vient ; avant le saut il n’est pas toujours tr`es simple de la calculer. Selon les machines l’adresse sauvegard´ee est l’adresse qui suit le branchement, ou l’adresse du branchement elle-mˆeme ; le retour de sous-programme doit ˆetre coh´erent avec ce choix. Les instructions de branchement `a des sous-programmes peuvent ˆetre absolues ou relatives, et l’adressage peut-ˆetre direct ou indirect par registre, avec ou sans d´eplacement. Sur le sparc on dispose de deux instructions de branchement avec sauvegarde, qui peuvent donc ˆetre utilis´ees pour coder des sauts `a des sous-programmes : call et jmpl. call est un branchement relatif `a adressage direct, qui sauvegarde sa propre adresse dans un registre, toujours le mˆeme. jmpl est un branchement absolu `a adressage indirect par registre avec d´eplacement, qui sauvegarde sa propre adresse dans un registre sp´ecifi´e par l’instruction. Nous d´etaillons au chapitre 13 l’utilisation des instructions de saut `a des sous-programmes, et la structure de pile sous-jacente, pour le codage des action et fonctions param´etr´ees des langages imp´eratifs usuels, comme celui pr´esent´e au chapitre 4.
On trouve sur certains processeurs, par exemple mips r10000, ultras- parc, PentiumPro, des instructions de transfert de registres conditionnels. Une telle instruction est conditionn´ee par le r´esultat de l’op´eration pr´ec´edente et permet d’´eviter des branchements explicites. Nous empruntons `a [SL96] l’exemple suivant : A, B : des entiers A ←− min (A, B) Le code produit est de la forme : { supposons A dans le registre r1 et B dans le registre r2 } SUB r1, r2, r3 { c’est-`a-dire r3 ←− r1 − r2 } MOV COND GT r3, r2, r1 { c’est-`a-dire : si r3 > 0 alors r1 ←− r2 } La question int´eressante avec ce type de langage machine est : comment ´ecrire un algorithme de traduction des langages de haut niveau en langage machine qui profite au mieux de ces instructions sophistiqu´ees ? Les compilateurs pour machines de ce type font appel `a des techniques assez ´elabor´ees d’optimisation de code.