Soit le fichier fma.c suivant: float fma(float a, float b, float c) { asm("mul.s/a %0,%2,%3" : "=f" (a) : "0" (a), "f" (b), "f" (c)); return a; } main(){ float a=2.0; float b=3.0; float c=4.0; a=fma(a,b,c);/*a=a*b+c=10.0*/ printf("%f\n", a); } L'instruction "mul.s/a" est annotée. Il faut alors interpréter les instructions annotées dans le simulateur. On édite sim-outorder.c: on modifie le décodeur. Dans ruu_dispatch, dans le switch(op), dans le #define DEFINST, on écrit: #define DEFINST(OP,MSK,NAME,OPFORM,RES,CLASS,O1,O2,I1,I2,I3) \ case OP: \ /* compute output/input dependencies to out1-2 and in1-3 */ \ out1 = O1; out2 = O2; \ in1 = I1; in2 = I2; in3 = I3; \ /* execute the instruction */ \ /*goo: run only if not annoted*/ \ if (!(inst.a & 0xffff0000)) { \ SYMCAT(OP,_IMPL); \ } Cela inhibe l'exécution à cet endroit de toutes les instructions annotées. Plus loin, juste après la fin du switch (/* operation sets next PC */), on ajoute: /*goo: special run for annoted instructions*/ if (inst.a & 0xffff0000) { if ((inst.a & 0xffff) == FMUL_S) { in3 = DFPR_F(FD); SET_FPR_F(FD, FPR_F(FD) * FPR_F(FS) + FPR_F(FT)); } } Cela permet de fixer les nouvelles dépendances de l'instruction annotée. Pour le fma, les trois registres FD, FS et FT sont des sources. FD est donc une source de plus. La macro SET_FPR_F effectue le calcul de fma. Il reste à compiler le fichier fma.c: bin/sslittle-na-sstrix-gcc -o fma fma.c En fabriquant un fma.s (gcc -S), on verrait dans le code source assembleur: l.s $f6,16($fp) #APP mul.s/a $f2,$f4,$f6 #NO_APP s.s $f2,8($fp) l.s $f0,8($fp) j $L1 On exécute la simulation: ./sim-outorder fma