1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios.

Slides:



Advertisements
Liknande presentationer
IT för personligt arbete F5
Advertisements

Visual Basic - Genomgång
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
EDA Digital och Datorteknik
Programstruktur: C för enchipsdatorer
2D1311 Programmeringsteknik med PBL
EDA Digital och Datorteknik
De fundamentala datatyperna
Persondatorer Datorns internminne (Kapitel 6)
William Sandqvist Datorteknik övning 2 Subrutinanrop William Sandqvist
PC-teknik Repetition enligt önskemål som inkommit via mail. (täcker alltså inte alla moment i kursen)
23 August 2014 IS1200 Datorteknik vt09, föreläsning 10, (E och I mfl)1 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory.
Programmeringsteknik K och Media
Grundläggande programmering
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
9 September 2014IS1200 Datorteknik, förel 101 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory Access 3. Byte-code i JAVA.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Kapitel 13: I/O-system.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Programmering B PHP Lektion 2
Styrteknik: Programmering med MELSEC IL PLC2A:1
William Sandqvist C:s minnesmodell.
Grundläggande programmering
2G1510 Datorteknik fk Föreläsning 1, hösten 2003.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
William Sandqvist PIC PIC (Peripheral Interface Computer) är en datorkrets med ”allt i ett”. Prog Mem. Programminnet är 2048 instruktioner.
INTRODUKTION TILL PROGRAMMERING
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
31 March 2015IS1200 Datorteknik, förel 101 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory Access 3. Byte-code i JAVA.
31 March 2015 IS1200 Datorteknik ht2009 föreläsning 2, (D2)1 IS1200 Datorteknik Föreläsning 2 Vi bygger en processor Kursboken, valda delar av kapitel.
IS1200 Datorteknik Föreläsning CE F2 Vi bygger en processor Kursboken, delar av kapitel 7 31 March IS1200 Datorteknik föreläsning CE – F2.
1 386 Från s bits adressbuss –=>4GB minne kan adresseras 32 bits databuss max klockfrekvens: 40MHz Protected mode –virtuellt minne –segmentering.
Anders Sjögren Går det att simulera vår värld med 1:or och 0:or ?
Pipelining Föreläsning 4. T exe — CPU-exekveringstid I — Antalet exekverade instruktioner CPI — Genomsnittligt antal klockcykler per instruktion T c —
Digitalteknik 7.5 hp distans: 4.6 Adderare 4.45 Adderare Addition av två tal innebär att samma förfarande upprepas för varje position i talet. För varje.
William Sandqvist Melodispelaren Denna demonstrationslaboration visar, steg för steg, hur man skriver ett kort program i programspråket.
2 April 2015 IS1200 Datorteknik o k, föreläsning CE - F31 IS1200 Datorteknik Föreläsning CE F3 Metoder / subrutiner Kursboken, delar av kapitel 4.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
Programmeringsteknik för K och Media
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: -Exekveringstrådar.
William Sandqvist PWM Sinusoidal Hur tillverkar man en sinusformad spänning? En PWM-signal kan ge en sinusapproximation. Efter filtrering.
Kronljusströmställaren 0, 1, 2, 3
William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II William Sandqvist
1 June 20152G1502, föreläsning 3, vt G1502 Datorteknik allmän kurs Föreläsning 3 Metoder och subrutiner Kursboken, valda delar av kapitel 4 version.
1 June G1518, Förel 10, ht2005 (D3/CLMDA)1 2G1518 Datorteknik, ht 2005 version för D3 och CLMDA Föreläsning Processorkonstruktion 2. DMA, Direct.
1 June G1502, Föreläsning 9, vt2004 för IT1 2G1502 Datorteknik allmän kurs Föreläsning 9 1. Processorkonstruktion 2. DMA, Direct Memory Access 3.
2 June G1502, Föreläsning 8, vt2004 för E och I1 2G1502 Datorteknik allmän kurs Föreläsning 8 Processorkonstruktion DMA, Direct Memory Access.
Föreläsning 1 Introduktion till kursen. Algoritmer
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)1 2G1518 Datorteknik Föreläsning 3 Metoder / subrutiner Kursboken, valda delar av kapitel 4 vt 2007.
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
14 July 2015 IS1200/2G1518 Datorteknik, föreläsning 2, ht2007 (D2)1 IS1200 Datorteknik Föreläsning 2 Vi bygger en processor Kursboken, valda delar av kapitel.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
30 July 2015 IS1200 Datorteknik föreläsning CE - F11 IS1200 Datorteknik Föreläsning CE F1 Computer Engineering Introduktion.
31 July 2015IS1200 Datorteknik, förel 101 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory Access 3. Byte-code i JAVA.
William Sandqvist Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling.
4 August 2015 IS1200 Datorteknik föreläsning CE - F91 IS1200 Datorteknik Övning 10.
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
15 August 2015 IS1200 Datorteknik föreläsning CE - F11 IS1200 Datorteknik Föreläsning CE F1 Computer Engineering Introduktion.
William Sandqvist KIA’s fabrik i Slovenien En bil i minuten lämnar bandet – tar det en minut att bygga en bil? Nej för KIA's fabrik utanför.
3 October 2015 IS1200 Datorteknik ht2009 föreläsning 3, (D2)1 IS1200 Datorteknik Föreläsning 3 Metoder / subrutiner Kursboken, valda delar av kapitel 4.
KPP053, HT2015 MATLAB, Föreläsning 4
Grundläggande datavetenskap, 4p
Digitalteknik 3p - Kombinatoriska Byggblock
Kombinatoriska byggblock
Kombinatoriska byggblock
Digitalteknik 3p - Kombinatoriska Byggblock
Digitalteknik 3p - Kombinatoriska Byggblock
Presentationens avskrift:

1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios

2 Innehåll ● Repetition av pipelining ● Load/Store ● Hopp ● Villkorliga hoppinstruktioner ● Metodanrop ● Stack ● Registerfönster

3 Programexekvering i två steg (decode) EXECUTE FETCH (update PC) R

4 Hårdvara i processorn Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Program Memory n x 16 ALU IR Register File 32 x 32 PC R

5 PIPE - LINE införs nu Flera Instruktions-Register IR ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 NYTT R

6 Pipelining ger problem vid Data Dependencies ● Programexempel 44:ADD R4 <- R5 + R6 46:ADD R1 <- R2 + R3 48:ADD R7 <- R1 + R4 ● ”nya” R1 och R4 finns inte i REG-FILE R

7 Data Dependencies – inför nya data-vägar Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 48: R7 <- R1+R : R1 <- R2+R3 44: R4 <- R5+R6 R

8 ADD R dst, data n ADD Hur många bitar behövs ? Hur stor blir varje instruktion ? INSTRUKTIONSFORMAT Nios INSTRUKTIONSFORMAT med immediate data R

9 Immediate data inför ny dataväg ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 +2 R

10 Immediate data är bara 5 bitar ● En PreFiX-instruktion PFX införs ● PFX modifierar efterföljande instruktion och ger den ett längre immediate-värde ● PFX använder ett specialregister K ● Principen med prefixinstruktioner finns även i Pentium-serien R

11 Inför ny hårdvara K - register ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 +2 R

12 Hur används register K ? ● PreFiX-instruktionen PFX Imm 11 skriver ett 11 bitars värde till register K ● Instruktionen direkt efter PFX Imm 11 använder innehåll i K – sedan nollställs register K ● Imm 5 ökar till (Imm 11 cat Imm 5 ) R

13 PFX Imm 11 FIPFX - - PFX IMM 11 MOVI R dst, Imm 5 FIFOEXEWB R

14 Mall för makro – en syntetisk instruktion.macroCLR reg MOVI\reg, 0x0.endm Effekt: man kan använda en ny instruktion clr %ri för att nollställa register %ri R

15 ADD Rdest, regA, regB Skriv makro för add-instruktion med 3 register.macroADD reg1, reg2, reg3 MOV\reg1, \reg2 ADD\reg1, \reg3.endm R

16 Makrot MOVIA reg, Addr ;Ladda ett 32 bitars värde till ett register ;Värdet kan vara negativt.macroMOVIA reg, Addr PFX%hi(\Addr) MOVI\reg, %lo(\Addr) PFX%xhi(\Addr) MOVHI\reg, %xlo(\Addr).endm R

17 JUMP (R addr ) inför ny dataväg Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32 R

18 BRA Imm inför adder och datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32 R

19 Pipelining ger möjlighet till Branch Delay Slot  Instruktionen i minnespositionen närmast efter en hoppinstruktion hämtas och körs medan hoppet verkställs Programexempel 18: BRA 74 20: ADD … 22: … … 94: SUB... R

20 Slut på repetitionen ● Load/Store ● Nios ● Hoppinstruktioner ● Villkorliga hopp ● Metodanrop ● Stack ● Registerfönster R

21 LOAD och STORE ● Vi vill kunna utföra instruktionerna LOADR dst, [ R addr ] STORE [ R addr ], R src

22 ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC ADD IR0 IR1 IR2 RWM +2 LOAD och STORE med 4 stegs PIPE-LINE

23 LOAD och STORE med 4 stegs PIPE-LINE LOAD to Rd USE Rd FIFO MEM WBFIFOEXEWB Data från MEM finns tillgängligt Data från MEM finns tillgängligt för FO tack vare Data Forward

24 Behov av indexerad adress ● Programvariabler ligger samlade ● Ett register pekar ut variabelarean ● Varje LOAD/STORE behöver först en adressberäkning med ADD ● Indexerad adress LOAD R2 ← 8(R28); R2 ← hm(r28 + 8) ● Sparar en klockcykel vid varje LOAD

25 Programvariabler samlade i minnet ● Variabler – int i; – int j; – int k; ● läggs efter varann i minnet av kompilatorn minne i j k

26 Ett register pekar ut variabelarean ● Vid programstart tilldelas registret adressen till variabelarean i minnet minne i j k register r28

27 Varje LOAD/STORE behöver adressberäkning med ADD ● k ska hämtas till R2 ● R17 är ledigt ● ADDI R17 <- R ● LOAD R2 <- (R17) ● En extra instruktion ● En extra klockcykel ● Extra krångel i programkoden minne i j k register r28

28 Indexerad adress ● Addition i LOAD- instruktionen ● LOAD R2 ← 8(R28) ● innebär R2 ← hm(r28+8) ● Innehåll i R28, plus talet 8, blir minnesadress minne i j k register r28

29 Sparar en klockcykel vid varje LOAD ● add följt av load byts mot ● load med "inbyggd" addition addi r17←r28+8 load r2←(r17) FIFO EXE WB FIFO MEM WB load r2←8(r17) FIFOALUWB MEM

30 LOAD och STORE  Vi vill alltså kunna utföra instruktionerna LOADR dst, Offset[ R addr ] STOREOffset[ R addr ], R src

31 LOAD Rdst <- Offset[Raddr]  Vi kan utföra instruktionen/operationen LOADR dst, Offset[ R addr ]  med koden (tar 2 klockcykler eller hur) ADDIR adr, Offset LOADR dst, [ R addr ]

32 STORE Offset[Raddr] <- Rsrc  Vi kan utföra instruktionen/operationen STOREOffset[ R addr ], R src  med koden (tar 2 klockcykler eller hur) ADDIR adr, Offset ST[ R addr ], R src

33 5 stegs PIPE-LINE ALUFetch OperandMEMFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC ADD IR0 IR1 IR2 RWM IR3 Write Back +2

34 Programexekvering i fem steg ● FI- Fetch Instruction ● FO - Fetch Operand ● ALU - Calculation ● MEM - Memory Reference ● WB - Write Back

35 5 stegs PIPE-LINE LOAD FIFOALUWB MEM FIFOALUWB MEM ADD Hur lång tid tar varje instruktion ? Antal cykler per instruktion, CPI ? Antal instruktioner per cykel ?

36 Pipelining – problem med Data Dependency vid Load LOAD to Rd FIFOALUWB MEM FIFOALUWB MEM Rd tillgängligt från minne Rd önskas till ALU-reg men finns inte tillgängligt USE Rd

37 Data Dependency vid Load – Load Delay Slot LOAD to Rd FIFOALUWB MEM FIFO stall Rd tillgängligt från minne Rd levereras till ALU-reg en klockcykel senare USE Rd WB MEM ALU Rd önskas till ALU-reg men finns inte tillgängligt

38 Load DELAY även vid Data Forward LOAD FIFOALUWB MEM ADD Tillgängligt från minne FIFOALUWB MEM Skriv till ALU-reg Data Forward fungerar FIFOALUWB MEM NOP?

39 Programmering med hopp ● Hopp = ett värde skrivs till PC ● Effektivadress skrivs till PC ● Olika adresseringsmetoder finns ● JUMP Label brukar använda absolut adress ● BRA Label brukar använda PC-relativ adress

40 Ovillkorligt hopp Villkorligt hopp ● Ovillkorligt hopp utförs alltid Exempel: JMP och BRA ● Villkorligt hopp utförs endast om ett angivet villkor är sant Exempel Bcc där cc är villkoret ● Exempel på villkor EQZ = EQual to Zero NEZ = Not Equal to Zero

41 JUMP och BRA JUMP brukar ha direkt adress BRA brukar ha PC-relativ adress JMP 18 ;PC := 18”hopp till 18”. BRA 18 ;PC := pc + 18”hopp till 66” 08: 18: 46: 66:

42 Typisk hopp-instruktion JUMP Label  Absolut adressering  Läget Label motsvarar en binär adress  Kopiera Label till PC  Om PC har 32 bitar bör Label vara 32 bitar  Adressen Label lagras i instruktionen

43 Typisk hopp-instruktion BRA Label  PC-relativ adressering  Läget Label motsvarar en binär adress  Före körning beräknar assemblern hur långt från instruktionen Label finns  Avståndet lagras i instruktionen som displacement eller offset  Vid körning adderas offset till PC  offset kan vara positivt eller negativt

44 Typisk hopp-instruktion JUMP (R addr )  Kopiera registerinnehåll till PC  Register med 32 bitar betyder att 32-bits adress kan användas  Hur får man in 32-bits adress i registret?  MOVIA R addr, Imm 32 eller motsvarande

45 Nios hopp-instruktion JMP %rA  Skifta innehåll i register %rA ett steg åt vänster och kopiera till PC

46 Nios JMP %rA inför nya datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC IR0 IR1 IR2 +2

47 Nios hårdvara för JMP %rA 32 bitar från ”A-busen” Program Counter 0 ignoreras

48 Typisk hopp-instruktion BR Imm n  PC sätts till PC + Imm n  Hur stor är Imm n ?  Hur stor vill vi att Imm n ska vara helst ?

49 Nios hopp-instruktion BR IMM11  Skifta IMM11 ett steg vänster  gör Sign Extension  addera till aktuellt värde i PC  PC <- PC ( sext( IMM11 ) << 1 )

50 BRA Imm n inför ADDitionsenhet och datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32

51 Nios hårdvara för BR IMM IR0 PC ADD IMM11: 11 bitar från IR0 Sign Extension

52 Typisk instruktion SUBR dst, R srcA, R srcB  Subtrahera innehåll i R srcA från R srcB  och skriv till R dst  Förutom resultatet / skillnaden så lagras ytterligare information i STATUS-flaggor

53 Typisk instruktion CMPR srcA, R srcB  Jämför innehåll i R srcA och R srcB genom att  Subtrahera innehåll i R srcA från R srcB  Men skriv ej resultat till något register  Information om resultatet / skillnaden lagras som information i STATUS-flaggor

54 Vanliga STATUS-flaggor ● Z = Zero; ”utfall lika med noll” ● N = Negativ; ”utfall med negativt tecken” ● V = oVerflow; ”utfall med overflow” – summan av två positiva tal har blivit negativ ● C = Carry-ut från ALU ● Påverkas av ADD, SUB, CMP...

55 STATUS -flaggor Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 NVZC Register File 32 x 32 Register File 32 x 32

56 Gäller detta för Nios-Processorn ? R0 R31 R1 PC Minne Generella registerProgramräknare NZVC

57 Villkorlig hopp-instruktion Bcond Imm n  PC sätts till PC + Imm n om cond är sant  PC sätts till PC + n om cond är falskt (n är antal bytes per instruktion)  Nios har ingen instruktion Bcond Imm  Det måste finnas minst en villkorlig instruktion för att klara en IF-sats

58 Nios har villkorlig instruktion IFS cc_IMM4  if-skip  IFS Conditionally execute next instruction  Om villkoret är sant utförs nästa instr.  Om villkoret är falskt skippas nästa instruktion  Om nästa är en PFX så skippas 2 instr.

59 Nios har villkorlig instruktion SKPS cc_IMM4  SKPS Skip On Condition Code  Om villkoret är sant skippas nästa instr.  Om villkoret är falskt utförs nästa instruktion  Om nästa är en PFX så skippas 2 instr.

60 IFS cc_IMM4 SKPS cc_IMM4  Cc_IMM4 kan väljas bland 14 olika  cc_eq, cc_ne, cc_lt osv. enligt tabell Program-exempel: if (reg1==0) goto Label CMPIreg1, 0;jämför reg1 med noll IFScc_eq;om Z=1 BRLabel;hoppa till Label

61 14 olika villkor finns i Nios ● cc_ncC = 0 ● cc_cC = 1 ● cc_nzZ = 0 ● cc_zZ = 1 ● cc_plN = 0 ● cc_miN = 1 ● cc_ltN xor V ● cc_genot(N xor V) ● cc_gt not(Zor(NxorV)) ● cc_le Zor(NxorV) ● cc_nvV = 0 ● cc_vV = 1 ● cc_hinot (C or Z) ● cc-laC or Z

62 Alias för villkor i Nios ● cc_cs = cc_cCarry Set = Carry ● cc_n = cc_miNegative = MInus ● cc_cc = cc_ncCarry Clear = No Carry ● cc_vc = cc_nvoVerflow Clear = No oVe... ● cc_eq = cc_zEqual = Zero ● cc_ne = cc_nzNot Equal = Not Zero ● cc_vs = cc_voVerflow Set = oVerflow ● cc_p = cc_plPlus = PLus

63 Nios instruktion IFRZ reg ● Execute next instruction if register is Zero ● Exempel: if (reg1==0) goto Label IFRZreg1;om reg1 = 0 BRLabel;hoppa till Label ● SKPRNZ är ekvivalent med IFRZ ● Om nästa är en PFX så görs två nästa

64 Nios instruktion IFRNZ reg ● Execute next instruction if register is Not Zero ● Exempel: if (reg1 != 0) goto Label IFRNZreg1;om reg1 ej är 0 BRLabel;hoppa till Label ● SKPRZ är ekvivalent med IFRNZ ● Om nästa är en PFX så görs två nästa

65 funktioner, subrutiner, metoder ● Hur sker anrop ? ● Med hoppinstruktion ! ● Hur sker återhopp ? ● Med hoppinstruktion ! ● Returadress måste lagras !

66 Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … RETURN

67 Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … CALL FKN RETURN FKN: MUL … CALL NEW RETURN

68 funktioner, subrutiner, metoder Hur sker parameteröverföring Var lagras parametrar ● från anropare till rutinen, inparametrar ● från rutinen till anroparen, returvärden Olika typ av parameter ● värde ● pekare)

69 Nios hopp-instruktion BSR IMM11  Liknar BR IMM11 med tilläggg att  Returadress sparas i register %R15=%o7  Returadressen är adressen till instruktionen närmast efter hoppluckan dvs adress till BSR ökat med 4  Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15

70 Nios hopp-instruktion CALL %rA  Liknar JMP %rA med tillägg att  Returadress sparas i register %R15=%o7  Returadressen är adressen till instruktionen närmast efter hoppluckan dvs adress till CALL ökat med 4  Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15

71 Nios hårdvara för BSR och CALL alt. 2 0 PC A-bus till ALU-A register 32 bitar från PC ignoreras... A-bus till ALU-A register

72 Stackhantering ● Stack är speciell reserverad plats i minnet ● Stack Pekare pekar på plats i stacken ● PUSH-operation, lägg på stack ● POP-operation, hämta från stack

73 STACK operationer PUSH och POP Stack Pointer SP PUSH op: SP <- sp - n mem(sp) <- op POPdst: dst <- mem(sp) SP <- sp + n n = antal bytes + -

74 STACK PUSH och POP operationer ● PUSHR src SUBI%sp, 4 ST[%sp], R src ● POPR dst LDR src, [%sp] ADDI%sp, 4

75 PUSH reg ;Pusha ett register på stacken.macroPUSH reg SUBI%sp, 4;%sp = %o6 ST[%sp], \reg.endm ;PUSH %o6 är inte bra

76 POP reg ;Poppa ett register från stacken.macroPOP reg LD \reg, [%sp] ADDI%sp, 4;%sp = %o6.endm ;POP %o6 är förödande

77 Nios stöd för stack ● Stack Pointer = %r14 = %sp (alias %o6) ● Finns det Stack-operationer ? ● LDS är LOAD R dst <- [%sp, IMM8] ● STS är STORE [%sp,IMM8] <- R src med flera variationer ● Ingen PUSH- eller POP-instruktion ● Ingen JSR/RTS med returadress på stack

78 Nios stöd för subrutiner  Anrop med CALL reg, returadress i register %r15 = %o7 innehållet i reg multipliceras med 2 innan det skrivs till PC, jämför med JMP reg  Anrop med BSR Label  Retur med RET (JMP %r31 alias %i7)  Retur med LRET (JMP %r15 alias %o7)

79 Returadress vid subrutinanrop ● I ett speciellt register (fördel/nackdel) ● I valfritt register (fördel/nackdel) ● I minnet på speciell plats (fördel/nackdel) ● I minnet på valfri plats (fördel/nackdel) ● I minnet på en stack med PUSH (fördel/nackdel) ● I första ordet i subrutinen (fördel/nackdel)

80 Register Window Vad? Hur? Varför?

81 Register Window ● 5-bits registernummer = 32 register ● %g0-%g7 = %r0 -%r7globala ● %o0-%o7 = %r8 -%r15ut-register ● %L0-%L7 = %r16-%r23lokala register ● %i0-%i7 = %r24-%r31in-register

82 Registerfönster  32 register är direkt tillgängliga  128 eller 256 eller 512 register totalt  CWP - Current Window Pointer anger vilka register som just nu är direkt åtkomliga  CWP finns i statusregister %ctl0 !

83 Register Window ● CWP = Current Window Pointer ● SAVE ”öppna nytt fönster” minska CWP med 1 ● RESTORE ”byt till gammalt fönster” öka CWP med 1

84 Exempel: tre fönster Ins Locals Outs Ins Locals Outs Ins Locals Outs Globals

85 Exempel: tre fönster Ins Locals Outs Ins Locals Outs Ins Locals Outs Globals t I huvudprogram CALL RUT I rutinen RUT SAVE %sp,0 Nytt register- fönster för RUT I rutinen RUT CALL FKN I rutinen FKN SAVE %sp,0 Nytt register- fönster för FKN

86 Tre fönster ● Metodanrop CALL RUT ● I metoden RUT – SAVE %sp,0 minskar CWP med 1 – Metodanrop CALL FKN – I metoden FKN ● SAVE %sp,0 minskar CWP med 1

87 Table 20. Smallest Nios Register File Reg[.. Reg[24..31] Reg[16..23] Reg[8..15] Reg[ ] Reg[ ] Reg[ ] Reg[0..7] %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 SAVE RESTORE CWP = 0 CWP = 1 CWP = 5 CWP = 6 CWP = 4 CWP = 2

88 Register- fönster- cirkeln ● Exempel – 8 fönster ● Fönster 7 används bara av handler för window overflow

89 Exempel på subrutinkod utan SAVE och RESTORE nästlat subrutinanrop går ej RUT:kod kod ;;;BSR RUT2;subrutinanrop nix! … LRET;JMP %07

90 RUT:SAVE %sp,0;ändra inte %sp kod BSR RUT2;fungerar … RET;JMP %i7 RESTORE;i hopplucka Exempel på subrutinkod med SAVE och RESTORE nästlat subrutinanrop går bra

91 Parameterplats till och från subrutin  I register (fördel/nackdel)  I minnet på fast adress (fördel/nackdel)  I minnet på en stack (fördel/nackdel)

92 Exempel på parameteröverföring med SAVE och RESTORE  Anroparen lagrar parametrar i %o-register (utom %o7)  Anroparen gör BSR eller CALL varvid returadress sparas i %o7  Subrutinen gör SAVE varvid alla %o-reg hamnar på platser %ireg  Returadress finns nu i %i7  Parametrar finns nu i %i-register  Det finns 16 ”nya” register, 8 st %Local och 8 st %Out  Subrutinen arbetar  Subrutinen gör RESTORE  Returadress finns nu i %o7 varvid retur ska göras med JMP %o7 (samma som LRET)

93 Exempel på parameteröverföring med PUSH och POP  Anroparen lagrar parametrar på stacken med PUSH  Anroparen gör BSR eller CALL varvid returadress sparas i %o7  Parametrar finns nu i på stacken  Det finns inga ”nya” register (kan fixas med SAVE/RESTORE)  Subrutinen arbetar och  Lägger eventuella returparametrar i register eller på stack  Returadress finns nu i %o7 varvid retur ska göras med JMP %o7 (samma som LRET)  Anroparen ska städa på stacken (med POP eller ADD till %sp)

94 Föreläsning 3 Sammanfattning ● MACRO är praktiskt att använda ● HOPP finns av olika slag ● Subrutiner kan anropas ● Parametrar kan överföras ● Stack med PUSH och POP är bra att ha ● Register Window