                        Ma vie chez les SPARCS (tm)
                        



Les vacances sont l'poque idale pour voyager et connatre de
nouvelles personnes, personnellement, j'ai t en Sparcland, et je
me suis fait des copains.

Les SPARCS sont des processeurs quipant les SUN, comme le
SPARC 5,10,20... et probablement les ULTRA-SPARC.

Il s'agit de processeurs RISC 32bits,  architecture load/store,
c'est  dire qu'il n'y  pas d'instruction du type
"add [variable], 42", au lieu de ca tous les accs mmoires
passent par les instructions load et store, ce qui donne ca:

(%r est la syntaxe d'un registre)

      ld [variable], %r
      add %r, 42, %r   
      st %r, [variable]


Ce n'est pas vraiment gnant, car le processeur possde 32
registres entiers, %r0 a %r31, ou encore:

   %g0     (= %r0)     : toujours a 0
   %g1-%g7 (= %r1-%r7) : registres globaux

   %o0-%o5 (= %r8-%r13): registres locaux, ou paramtres
   %sp     (=%r14 =%o6): stack pointer
   %o7     (=%r15)     : adresse d'appel (de la routine qui va
                         tre appele)

   %l0-%l7 (=%r16-%r23): variables locales

   %i0-%i5 (=%r24-%r29): arguments d'un call
   %fp   (=%r30 =%i6): "Frame pointer" <- equivalent de (e)bp
                       chez Intel
   %i7   (%r31)      : retour d'appel (de la routine actuelle)

Meme en oubliant %g0, %o7, %i7, %fp, et %sp, ca en fait des
registres... (soupir reveur)
Je reviendrai sur %o7 et %i7.

Les instructions se prsentent sous cette forme:

   add %o0, %o1, %l0  => l0 = o0 + o1
   sub %o0, %o1, %l1  => l1 = o0 - o1

Elles sont gnralement en double, suivant qu'elle mettent  jour
les flags (et finissent pas "cc"):

   add reg, regim, reg / addcc reg, regim, reg
   sub reg, regim, reg / subcc reg, regim, reg

Les instructions de saut sont des "branch", comme "ba": branch
always, "bn": branch never, "bl": branch on less, "ble": on less
or equal, "blu": on less Unisgned, "bcs": on C=1... 



Mais!!! Il n'y a pas d'instruction multiplication, ni division
entire !!!
A la place, de la multiplication, on a droit a une instruction
"mulscc", qu'il faut effectuer 32 fois de suite... 
De plus, elle utilise un registre special: %y

Par exemple, pour faire 3*5, avec 3 dans %o2 et 5 dans %0:

   mov 3, %o2
   mov 5, %o0

   mov %o0, %y

   nop      ! commentaire: je sais pas pourquoi les trois nop...
   nop
   nop
   andcc %g0, %g0, %o1   ! %g0 est special et vaut toujours 0

   mulscc %o1, %o2, %o1
   ... encore 31 fois de suite

   mov %y, %o0 ! resultat dans %o0


Pour la division, il n'y a meme PAS de "divscc", il faut tout
faire a la main. Dans les progs, il est carrment fait appel a un
call, call .mul, et call .div .....  Aaargh (cri de desespoir)

Le SPARC ne possde pas de multiplication entire, mais il dispose
de 32 registres flottants, et est conforme aux spcifications
IEEE 754. (ouf)



L'assembleur SPARC propose des instructions call et ret, qui sont
converties ainsi:

   "call %o0"  devient     jmpl %o0, %o7
   "ret"       devient     jmpl %i7+8, %g0

D'ou l'usage reserve de %o7 et %i7.

Encore un truc marrant, le processeur est "pipelined", et il
execute deux instructions, on voit alors souvent ca:

      ret
      restore               ! <- restaure les registres

Par contre cela implique des nop apres les sauts,  du genre:

      call subr
      nop

Deux registres sont utiliss pour pointer sur "l'instruction
courante": le pc "program counter" ((e)ip chez Intel), et %npc
"next program counter".



Toutes les instructions font 32bits, et sont divises en trois
classes:

   - le call ("format one instruction")
      npc = (instruction[29:0] << 2) + pc

   - les branch et sethi ("format two instruction")
           pour les sauts, le deplacement est sur 22 bits

   sethi est l'instruction qui permet de charger les 22 bits hauts 
   d'un registre, ce qui sert a initialiser un registre avec une
   valeur immdiate sur 32 bits, en le combinant avec un "or":

          sethi 0x30cf0034 >> 10, %o0
          or %o0, 0x30cf0034 & 0x3ff, %o0

   - les autres ("format three instruction"), dans ce format, une
     valeur immdiate est code sur 13 bits, d'o le "sethi". On y
     trouve les add, xor, ld (load)...
	



Le SPARC ne dispose pas d'instruction in/out, les entres/sorties
sont mappes en mmoire, entre l'adresse 0xfff00000 et 0xffffe000,
un prog commence en 0x2000 et finit en 0xf8000000.

Mais il s'agit d'espace memoire virtuelle, sur 32 bits, la mmoire
physique tant sur 36 bits, avec des pages de 4 Kilo a 4 Giga.
La MMU gre une table des pages, avec, pour chaque entre le PPN
(Physical Page Number), des droits d'acces (user/superviser,
read-only/read-write), et des flags (cachable, modifiee).

L'adresse physique est obtenue en faisant un "or" sur le PPN et
l'adresse virtuelle:

       <- PPN -24bits ->
  OR              <---- memoire virtuelle -->
       <- memoire physique -------36bits--00>

Le PPN doit donc avoir les bits en commun avec la mmoire
virtuelle  0, plus la page est grosse, moins il y a de PPN, et
inversement.




En conclusion, l'architecture SPARC est tres proche de
l'architecture MIPS, sauf que le MIPS il a des mul et div (ca fait
pas risc ca...), qu'il n'a pas d'instruction "cmp", mais des "slt"
(set less than ). MIPS signifie d'ailleurs "MicroProcessor without
Interlocked Pipelined Stage", c'est a dire, que l'instruction load
n'est pas blocante si l'instruction qui suit utilise le contenu du
registre charg... (des nop en perspective ;)

En resume, plusieurs choses m'ont pat, chez les SPARCS,l'absence
de div, de mul, le nombre d'instruction (il y en a quand mme
beaucoup), le pipeline, et surtout la "propret" des instructions
(tout sur 4 octets). Peut-tre de bonne perspectves pour Merced..

Je tiens quand mme a prciser que je n'ai jamais programm en
assembleur SPARC, (juste quelques gdb), et que ma source
d'inspiration est un excellent bouquin, de Richard P. Paul:
"Sparc Architecture, Assembly Language Programming, & C."



                                        aLgoL / Psykotrope



Je ne sais pas s'il faut le dire, mais,
SPARC est un registred trademark de SPARC International,
Unix est un registred trademark d'AT&T Bell Laboratories,
DefCoN est un registred trademark de K!Prods.

