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