200 likes | 295 Views
SPARC Programming Model. 24 “window” registers 8 global registers Control registers Multiply step PSR (status flags, etc.) Trap Base register Window Invalid Mask Two program counters ( PC and nPC ). SPARC Program. /* This program converts a temperature in Celcius to Fahrenheit.
E N D
SPARC Programming Model • 24 “window” registers • 8 global registers • Control registers • Multiply step • PSR (status flags, etc.) • Trap Base register • Window Invalid Mask • Two program counters (PC and nPC)
SPARC Program /* This program converts a temperature in Celcius to Fahrenheit. George Wells - 30 May 2003 */ offs = 32 /* Variables c and f are stored in %l0 and %l1 */ .global main main: mov 24, %l0! Initialize c = 24 mov 9, %o0! 9 into %o0 for multiplication mov %l0, %o1! c into %o1 for multiplication call .mul ! Result in %o0 nop ! Delay slot mov 5, %o1! 5 into %o1 for division call .div ! Result in %o0 nop ! Delay slot
Example (cont.) ... add %o0, offs, %l1 ! f = result + offs mov 1, %g1! Trap dispatch ta 0 ! Trap to system
mov 9, %o0! 9 into %o0 for multiplication call .mul ! Result in %o0 mov %l0, %o1! c into %o1 for multiplication • Better! Filling Delay Slots mov 9, %o0! 9 into %o0 for multiplication mov %l0, %o1! c into %o1 for multiplication call .mul ! Result in %o0 nop ! Delay slot • Not very efficient
Modified Program main: mov 24, %l0! Initialize c = 24 mov 9, %o0! 9 into %o0 for multiplication call .mul ! Result in %o0 mov %l0, %o1! c into %o1 for multiplication call .div ! Result in %o0 mov 5, %o1! 5 into %o1 for division ...
3. Control Transfer Instructions • Branching • Unconditional: ba bn • Conditional: bicc • icc= Integer Condition Codes • Condition flags are set explicitly by arithmetic and logical operations • E.g. addcc
Delayed Control Transfer • Increases the efficiency of pipelining
Example /* This program converts temperatures between 10 and 20 in Celcius to Fahrenheit. George Wells - 30 May 2003 */ offs = 32 /* Variables c and f are stored in %l0 and %l1 */ .global main main: mov 10, %l0 ! Initialize c = 10 loop: mov 9, %o0 ! 9 into %o0 for .mul call .mul ! Result in %o0 mov %l0, %o1 ! c into %o1 for .mul call .div ! Result in %o0 mov 5, %o1 ! 5 into %o1 for .div . . .
Example (cont.) . . . add %o0, offs, %l1 ! f = result + offs add %l0, 1, %l0 ! c++ cmp %l0, 21 ! c < 21 ? bl loop nop ! Delay slot mov 1, %g1 ! Trap dispatch ta 0 ! Trap to system
Annulled Branches • Delay slot instruction is ignored • Conditional: if branch is not taken • Unconditional: always annulled
Unoptimised assembler: ! Assumes a is in %l0 and b is in %l1 b test ! See if loop should execute nop ! Delay slot loop: add %l0, %l1, %l0 ! a = a + b test: cmp %l0, 17 ! a <= 17 ble loop ! If so branch back to start nop ! Delay slot An Annulled Branch • Java/C Code: while (a <= 17) a = a + b;
Optimised Assembler ! Assumes a is in %l0 and b is in %l1 b test ! See if loop should execute nop ! Delay slot loop: test: cmp %l0, 17 ! a <= 17 ble,a loop ! If so branch back to start add %l0, %l1, %l0 ! a = a + b
4. Logical and Arithmetic Operations • Logical Operators • and or xor • xnor andn orn • + cc to set the condition codes • Shift Operators • sra srl sll
Arithmetic Operators • Only addition and subtraction • add[x][cc] • sub[x][cc] • [x] — with carry • [cc] — to set the flags
Multiplication • Long multiplication is supported by the “multiply step” instruction: • mulscc
Division • Use the standard routines: • .div .rem • .udiv .urem