Assembleur C66xx
Assembleur C66xx
Assembleur C66xx
C66xx
2/03/23 1
Plan
• Introduction
• Appel depuis un programme en C
• Structure minimale d’un code en assembleur
• Structure d’une ligne de code
• Descripiton d’une instruction
• Delay Slot (DS) & FUL (Fonctional Unit Latency)
• Appel depuis un en language C
• Types d’instructions
• Modes d’adressage
• Les contraintes
2/03/23 2
Introduction
• l’assembleur est plus difficile à construire qu’un code C,
en compromis aux performances.
• En général on souhaite seulement optimiser des
routines critiques principaux. Les autres routines n’ont
pas intérêt à être optimiser tellement.
• En général, on mixe l’utilisation du C et de l’assembelur :
ØLe C pour des routines/opérations n’ayant pas besoin
d’être opTmisées (routines d’initialisations, déclarations
des données, allocations, ...).
Øl’Assembleur pour les fonctions principaux et critiques
en temps d’exécution.
2/03/23 3
Structure minimale d’un code en assembleur
• L’appel d’une routine se fait depuis le code en C
de la même manière que l’appel d’une fonction en
C.
.global _Fonction_Asm
_Fonction_Asm
ADD ….
MPY .... ; Commentaire
label SUB ....
...
II ...
B .S2 B3
2/03/23 NOP 5 4
Structure minimale d’un code en assembleur
•_Fonction_Asm : étiquette indiquant le début de la
définition de la routine ASM.
• .global : directive affecte une visibilité globale à l’entité "
_Fonction_Asm ", de telle façon que ça soit possible de
l’appeler à partir d’un code C
•l’instruction B (branch), à la fin, s’exécutera sur l’unité .S2
avec l’opérande dans le registre B3 . Cet opérande ni que
l’adresse de la suite du _Fonction_Asm
.global _Fonction_Asm
2/03/23 7
Format d’une instruction en assembleur
Structure d’une ligne de code en assembleur
Label: parallel bars [condition] instruction unit operands ;comment
2/03/23 10
oncept I: C6000 Core
A Simplified Load/Store
A Simplified Load/Store Architecture
Architecture
gure 3 illustrates a simplified load/store architecture, which consists of a processing unit that hand
xecution of all instructions, and many registers that hold data as operands or results for these
structions. All the instructions to be executed are fetched from the memory to the processing unit
equentially (the address of the instruction is stored in the program counter register). Data can be l
om the memory to the registers via a load instruction; and register contents can be stored back to
emory via a store instruction.
Register
Memory
Processing
Unit
256-Bit
Instruction Fetch
64-Bit 64-Bit
2/03/23 12
Figure 4. High Level C6000 DSP Architecture
L’étage d’exécution
2/03/23 13
Modes d’adressage
• Un mode d’adressage correspond à une stratégie de
manipulation d’une donnée par une instruction
• Les processeurs C66x sont dédiés au calcul, Seuls 3
modes d’adressage sont supportés par le jeu
d’instruction (ISA) :
• Adressage registre : instructions arithmitiques, …
• Adressage indirect : instructions de management
de données de et vers la mémoire (LDx et STx)
• Adressage immédiat : move, zeroing, …
2/03/23 14
Instructions de management de
données : Move, Load & Store
• Le CPU est à modèle LOAD/STORE : des unités
d’exécution dédiées aux accès mémoire (D1 et
D2).
• Chacune de ces deux uniteś possède un chemin de
64bits (8 octets de données) vers le niveau
physique L1D (Level 1, SRAM ou Cache) de la
hiérarchie mémoire.
2/03/23 15
Instructions de management de données
Les instructions des familles LDx (Load) et STx (Store)
sont suffixées par la taille des données à transférer :
•xxB (Byte) : 1 octet / 8 bits (char)
•xxH (Half Word) : 2 octets / 16 bits (short)
•xxW (Word) : 4 octets / 32 bits (int, float)
•xxDW (Double Word) : 8 octets / 64 bits (long, double)
Exemple : LDW .D1 *A6, A3
Remarque : le registres contenant un pointeur
(adressage indirect) sont préfixés par le symbole *,
comme en langage C.
2/03/23 16
Instructions arithmétiques
• Add/subtract/multiply:
ADD .L1 A3,A2,A1 ; A1←A2+A3
SUB .S1 A1,1,A1 ; decrement A1
MPY .M2 A7,B7,B6 ; multiply LSBs
||MPYH .M1 A7,B7,A6 ; multiply MSBs
2/03/23 17
Instructions pour branchement et
boucle
• example de boucle :
MVK .S1 count, A1 ;loop counter
|| MVKH .S2 count, A1
LOOP MVK .S1 val1, A4 ;loop
MVKH .S1 val1, A4 ;body
2/03/23 18
Présentation du jeu d’instructions
Jeu d’instruction par unité
• Jeu d’instruction par unité:
.S Unit .L Unit
ADD MVKLH ABS NOT
ADDK NEG ADD OR
ADD2 NOT AND SADD
AND OR CMPEQ SAT
B SET CMPGT SSUB
CLR SHL CMPLT SUB
EXT SHR LMBD SUBC
MV SSHL MV XOR
MVC SUB NEG ZERO
MVK SUB2 NORM
MVKL XOR
MVKH ZERO
.D Unit
ADD STB/H/W
.M Unit ADDA SUB
MPY SMPY LDB/H/W SUBA
MPYH SMPYH MV ZERO
NEG
2/03/23 21
Instruction Delays
All C66x instructions require only one cycle to
execute, but some results are delayed.
2/03/23 25
Opcode map
2/03/23 29
register pair, and eight 16-bit values or four 32-bit values or two 64-bit values in a sin
128-bit register quadruplet.
Table 2-1
64-bit Register
64-bit Register Pairs
Pairs
Register File
A B
A1:A0 B1:B0
A3:A2 B3:B2
A5:A4 B5:B4
A7:A6 B7:B6
A9:A8 B9:B8
A11:A10 B11:B10
A13:A12 B13:B12
A15:A14 B15:B14
A17:A16 B17:B16
A19:A18 B19:B18
A21:A20 B21:B20
A23:A22 B23:B22
A25:A24 B25:B24
A27:A26 B27:B26
A29:A28 B29:B28
A31:A30 B31:B30
2/03/23 30
Table 2-2 128-bit Register Quadruplets
128-bit Register Quadruplets
Register File
A B
A3:A2:A1:A0 B3:B2:B1:B0
A7:A6:A5:A4 B7:B6:B5:B4
A11:A10:A9:A8 B11:B10:B9:B8
A15:A14:A13:A12 B15:B14:B13:B12
A19:A18:A17:A16 B19:B18:B17:B16
A23:A22:A21:A20 B23:B22:B21:B20
A27:A26:A25:A24 B27:B26:B25:B24
A31:A30:A29:A28 B31:B30:B29:B28
2/03/23 31
Registres utilisés par le code en C
A B
0
1
2
3
4
5
6
7
8
9
10
11 A sauvegarder puis à
12
13 restaurer si on les utilise en
14
15 assembleur
16
17
18
...
31
2/03/23 32
Tradeoffs
Tradeoffs
C/C++ Assembly Linear Assembly
L’extension .sa est celle de l’assembleur linéaire, on écrira alors directement du code assembleur standard en .asm
indépendamment de tout outil de post-optimisation. Le code binaire qui sera chargé dans la mémoire pour être
2/03/23
exécuté a l’extension .out 35
Example : Assembleur Linéaire vs Assembleur standard
_sumfunc: .cproc np ;.cproc directive starts a C callable
procedure
.reg y ;.reg directive use descriptive names for values that will be stored in
registers
MVK np,cnt
loop: .trip 6 ; trip count indicates how many times a loop will
iterate
SUB cnt,1,cnt
ADD y,cnt,y
[cnt] B loop
.return y
.endproc ; .endproc to end a C procedure