TD5 : Exécution conditionnelle des instructions

publicité
Université Paris Sud
Master d’Informatique (M1)
D. Etiemble
2004-2005
TD5 : Exécution conditionnelle des instructions
On examine dans ce TD des jeux d'instructions où l'exécution de toutes les instructions sont
conditionnelles.
Soit le jeu d'instructions ARM dont les instructions essentielles sont données en annexe. Toutes
les instructions sont à exécution conditionnelle, en fonction du contenu du registre code
condition : INSTcond, où INST est l'instruction, et cond est la condition (GT, GE, EQ; NE, LT,
LE…).
Dans l'implantation XScale (Intel), les mauvaises prédictions de branchement coûtent 4 cycles.
La prédiction statique est NP pour les branchements avant et P pour les branchements arrière.
Exercice 1 : si… alors… sinon
Q 1 : Donner les versions ARM avec et sans branchements pour l'exécution du code, avec le
nombre de cycles correspondants
int x[N], xmin, xmax;
int i;
xmin=x[0];
xmax=xmin;
for (i=1; i<10, i++)
{
if x[i] <xmin
xmin= x[i];
if xmax < x[i]
xmax=x[i];
}
Q 2 : Donner les versions ARM avec et sans branchements avec le nombre de cycles
correspondants
int a, b, c, d, e, f
if (a==0) { a++, b++, c++, d++, e++}
else (a--, b--, c--, d--, e--}
Q 3 : Etablir la formule qui compare les temps d'exécution des versions avec et sans
branchement pour l'expression
if (cond) {if_bloc}
else {else_bloc}
où
N1B est le nombre de cycles pour exécuter {if_bloc} en utilisant des branchements
N2B est le nombre de cycles pour exécuter {else_bloc} en utilisant des branchements
P1 est le pourcentage d'exécution du {if_bloc}
P2 est le pourcentage de mauvaise prédiction de branchement
N1C est le nombre de cycles pour exécuter {if_bloc} en utilisant les instructions
conditionnelles en supposant la condition vraie
N2C est le nombre de cycles pour exécuter {else_bloc} en utilisant les instructions
conditionnelles en supposant la condition fausse
1
Université Paris Sud
Master d’Informatique (M1)
D. Etiemble
2004-2005
Exercice 2 : expressions complexes
Q4 : Donner le code ARM pour les fonctions suivantes
a) int foo (int a, int b) {
if (a!=0 && b!=0)
return 0;
else return 1;
}
b) int foo (int a, int b) {
if (a!=0 || b!=0)
return 0;
else return 1;
}
Q5 : Donner le code ARM, puis le code IA-64 pour le programme suivant :
int T[N], a=0, b=0, c=0, d=0, i;
for (i=0; i<N; i++=)
{
if (T[i] <5)
a++;
if ((T[i] >=5)&& (T[i] <10))
b++;
if ((T[i] >=10)&& (T[i] <15))
c++;
if (T[i] >=15)
d++;
}
r1 pointe sur T[0]
r2 contient N
Instructions ARM (extrait)
Format des instructions arithmétiques et logiques
31-28
Cond
00
I
24-21
20
19-16
15-12
11-0
Code Op
S
n
d
Opérande 2
Rs est le registre source (s est le numéro)
Rd est le registre destination (d est le numéro)
Lorsque I =0, opérande 2 est obtenu comme suit
Opérande 2 = rotation à droite de 2 n positions [immédiat non signé sur 8 bits]
Où les 12 bits sont interprétés comme suit
11-8
7-0
2
Université Paris Sud
Master d’Informatique (M1)
D. Etiemble
2004-2005
Rotation (2 x n)
Immédiat
Lorsque I=1, opérande 2 est obtenu comme suit
Opérande 2 = décalage [Rm]
Où les 12 bits sont interprétés comme suit
11-4
3-0
Décalage (nb de bits)
m (numéro de registre)
Les instructions ARM sont définies à la fois pour les formats RR et RI : Opérande 2 = immédiat
ou Rm
Instructions arithmétiques
Instructions arithmétiques
ADD, SUB
ADC, SUBC
Instructions arithmétiques
RSB, RSC
Instructions logiques
Instructions de transfert
AND, ORR, EOR
MOV, MVN
Rd ← Rs op opérande 2
Rd ← Rs + opérande 2 + retenue
Rd ← Rs - opérande 2 + retenue -1
Rd ← opérande 2 - Rs
Rd ← opérande 2 - Rs + retenue -1
Rd ← Rs op opérande 2
Rd ← opérande 2
Rd ← complément de opérande 2
Les instructions mémoire sont les suivantes
Instruction
LDR
LDRB
STR
STRB
Signification
Chargement mot
Chargement octet
Rangement mot
Rangement octet
Action
Rd ← Mem32(AE)
Rd ← Mem8 (AE)
Mem32(AE) ← Rd
Mem8 (AE) ← Rd
Les modes d’adressage avec la syntaxe assembleur et leur effet sont résumés dans la table cidessous.
Mode
Déplacement 12 bits,
Pré-indexé
Déplacement 12 bits,
Pré-indexé avec mise à jour
Déplacement 12 bits,
Post-indexé
Déplacement dans Rm
Préindexé
Déplacement dans Rm
Préindexé avec mise à jour
Assembleur
[Rn, #deplacement]
Action
Adresse = Rn + déplacement
[Rn, #deplacement] !
Déplacement dans Rm
Postindexé
Relatif
[Rn], ± Rm, décalage
Adresse = Rn + déplacement
Rn ← Adresse
Adresse = Rn
Rn ← Rn + déplacement
Adresse = Rn + décalage
(Rm)
Adresse = Rn + décalage
(Rm)
Rn ← Adresse
Adresse = Rn
Rn ← Rn + décalage (Rm)
Adresse = CP + déplacement
[Rn], #deplacement
[Rn, ± Rm, décalage]
[Rn, ± Rm, décalage] !
Instructions de comparaison et branchement
3
Université Paris Sud
Master d’Informatique (M1)
CMP , TST
Instructions arithmétiques
avec suffixe S : ADDS, SUBS,
etc
Bcond (LT, LE, GT, GE, EQ,
NE…)
BL
BLcond
D. Etiemble
2004-2005
CMP Rs1, Rs2
TST Rs1, Rs2
SUBS Rd, Rs1, Rs2
Rs1-Rs2 → RCC
Rs1 and Rs2 → RCC
Rd ← Rs1 – Rs2
Positionne Rcc
Bcond, déplacement
Si cond, alors
CP ← NCP +déplacement
R14 ← NCP
CP ← NCP + déplacement
Si cond, alors { R14 ← NCP
CP ← NCP +déplacement}
BL déplacement
BLcond déplacement
Instructions IA-64 : extraits
Chargement compteur de boucle
Branchement boucle
mv lc=valeur
Br.cloop L1 ;
Chargement mémoire
ld rd=[rs], déplacement
Comparaison
(pc) cmp.cond. pi,pj=rs,imm
Br.cloop L1 ; ;
4
lc ←valeur
lc ←lc-1. Branchement si
lc≠0
Rd ←Mem (rs + depl)
Rs ←rs + déplacement
positionne les prédicats
Téléchargement