cs 61c: great ideas in computer architecturecs61c/fa17/lec/06/l06 riscv functions (1up).pdf•...

Post on 18-Feb-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

CS61C:GreatIdeasinComputerArchitecture

MoreRISC-VInstructionsandHowtoImplementFunctions

Instructors:KrsteAsanović andRandyH.Katz

http://inst.eecs.Berkeley.edu/~cs61c/fa17

9/14/17 Fall2017- Lecture#6 1

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 2

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 3

LevelsofRepresentation/Interpretation

lw x10,0(x12)lw x11,4(x12)sw x11,0(x12)sw x10,4(x12)

High-LevelLanguageProgram(e.g.,C)

AssemblyLanguageProgram(e.g.,RISC-V)

MachineLanguageProgram(RISC-V)

HardwareArchitectureDescription(e.g.,blockdiagrams)

Compiler

Assembler

MachineInterpretation

temp=v[k];v[k]=v[k+1];v[k+1]=temp;

0000 1001 1100 0110 1010 1111 0101 10001010 1111 0101 1000 0000 1001 1100 0110 1100 0110 1010 1111 0101 1000 0000 1001 0101 1000 0000 1001 1100 0110 1010 1111

ArchitectureImplementation

Anythingcanberepresentedasanumber,

i.e.,dataorinstructions

LogicCircuitDescription(CircuitSchematicDiagrams)

9/14/17 4

ReviewFromLastLecture…• Computer“words”and“vocabulary”arecalledinstructions and

instructionsetrespectively• RISC-VisexampleRISCinstructionsetusedinCS61C

– Lecture/problemsuse32-bitRV32ISA,bookuses64-bitRV64ISA• Rigidformat:oneoperation,twosourceoperands,onedestination

– add,sub,mul,div,and,or,sll,srl,sra– lw,sw,lb,sb tomovedatato/fromregistersfrom/tomemory– beq, bne, j fordecision/flowcontrol

• Simplemappingsfromarithmeticexpressions,arrayaccess,inCtoRISC-Vinstructions

9/14/17 5

Processor

Control

Datapath

Recap:RegistersliveinsidetheProcessor

6

PC

RegistersArithmetic&LogicUnit

(ALU)

Memory Input

Output

Bytes

Enable?Read/Write

Address

WriteData

ReadData

Processor-MemoryInterface I/O-MemoryInterfaces

Program

Data

CS61c

Exampleif-else Statement• Assumingtranslationsbelow,compilef→x10 g→x11 h→x12i →x13 j→x14

if (i == j) bne x13,x14,Else f = g + h; add x10,x11,x12

else j Exit f = g – h; Else: sub x10,x11,x12

Exit:

9/14/17 7

Magnitude Compares in RISC-V• Untilnow,we’veonlytestedequalities(==and!=inC);

Generalprogramsneedtotest<and>aswell.• RISC-Vmagnitude-comparebranches:

“BranchonLessThan”Syntax:blt reg1,reg2, labelMeaning: if(reg1<reg2)//treatregistersassignedintegers

goto label;• “BranchonLessThanUnsigned”

Syntax:bltu reg1,reg2, labelMeaning: if(reg1<reg2) //treatregistersasunsignedintegers

goto label;

9/14/17 8

CLoopMappedtoRISC-VAssemblyint A[20];int sum = 0;for (int i=0; i<20; i++)

sum += A[i];

addi x9, x8, 0 # x9=&A[0]addi x10, x0, 0 # sum=0addi x11, x0, 0 # i=0

Loop:lw x12, 0(x9) # x12=A[i]add x10,x10,x12 # sum+=addi x9,x9,4 # &A[i++]addi x11,x11,1 # i++addi x13,x0,20 # x13=20blt x11,x13,Loop

9

PeerInstructionWhichofthefollowingisTRUE?

RED:add x10,x11,4(x12)isvalidinRV32GREEN:canbyteaddress8GBofmemorywithanRV32wordORANGE:immmustbemultipleof4forlw x10,imm(x10)tobevalid

:Noneoftheabove

9/14/17 10

PeerInstructionWhichofthefollowingisTRUE?

RED:add x10,x11,4(x12)isvalidinRV32GREEN:canbyteaddress8GBofmemorywithanRV32wordORANGE:immmustbemultipleof4forlw x10,imm(x10)tobevalid

:Noneoftheabove

9/14/17 11

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 12

AssemblertoMachineCode(morelaterincourse)

foo.S bar.S

Assembler Assembler

foo.o bar.o

Linker lib.o

a.out

Assemblersourcefiles(text)

Machinecodeobjectfiles

Pre-builtobjectfilelibraries

Machinecodeexecutablefile

Assemblerconvertshuman-readableassemblycodetoinstructionbitpatterns

9/14/17 13

HowProgramisStoredMemory

Bytes

Program

Data

OneRISC-VInstruction=32bits

9/14/17 14

Processor

Control

Datapath

ProgramExecution

PC

RegistersArithmetic&LogicUnit

(ALU)

Memory

BytesInstructionAddress

ReadInstructionBits

Program

Data

• PC (programcounter)isinternalregisterinsideprocessorholdingbyte addressofnextinstructiontobeexecuted

• Instructionisfetchedfrommemory,thencontrolunitexecutesinstructionusingdatapath andmemorysystem,andupdatesprogramcounter(defaultisadd+4bytestoPC,tomovetonextsequentialinstruction)

9/14/17 15

IntheNews:Whyfastcomputersmatter

CS61c 16

EuropeanWeathersupercomputerECMWF50tonnes~120,000computecores(IntelBroadwell)10PetaBytes ofstorageRunsLinuxoneachnode

Break!

9/14/17 17

HelpfulRISC-VAssemblerFeatures

• Symbolicregisternames– E.g.,a0-a7 forargumentregisters(x10-x17)– E.g.,zero forx0

• Pseudo-instructions– Shorthandsyntaxforcommonassemblyidioms– E.g.,mv rd, rs = addi rd, rs, 0– E.g.2,li rd, 13 = addi rd, x0, 13

18

RISC-VSymbolicRegisterNames

19

Numbershardwareunderstands

Human-friendlysymbolicnamesinassemblycode

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 20

SixFundamentalStepsinCallingaFunction

1. Putparametersinaplacewherefunctioncanaccessthem

2. Transfercontroltofunction3. Acquire(local)storageresourcesneededforfunction4. Performdesiredtaskofthefunction5. Putresultvalueinaplacewherecallingcodecan

accessitandrestoreanyregistersyouused6. Returncontroltopointoforigin,sinceafunctioncan

becalledfromseveralpointsinaprogram9/14/17 21

RISC-VFunctionCallConventions• Registersfasterthanmemory,sousethem• a0–a7 (x10-x17):eightargumentregisterstopassparametersandtworeturnvalues(a0-a1)

• ra:onereturnaddressregistertoreturntothepointoforigin(x1)

9/14/17 22

InstructionSupportforFunctions(1/4)... sum(a,b);... /* a,b:s0,s1 */}int sum(int x, int y) {return x+y;}

address (shown in decimal)1000 1004 1008 1012 1016 …2000 2004

CRISC-V

InRISC-V,allinstructionsare4bytes,andstoredinmemoryjustlikedata.Sohereweshowtheaddressesofwheretheprogramsarestored.

9/14/17 23

InstructionSupportforFunctions(2/4)... sum(a,b);... /* a,b:s0,s1 */}int sum(int x, int y) {return x+y;}

address (shown in decimal)1000 mv a0,s0 # x = a1004 mv a1,s1 # y = b1008 addi ra,zero,1016 #ra=10161012 j sum #jump to sum1016 … # next instruction…2000 sum: add a0,a0,a12004 jr ra # new instr. “jump register”

9/14/17 24

CRISC-V

InstructionSupportforFunctions(3/4)... sum(a,b);... /* a,b:s0,s1 */}int sum(int x, int y) {return x+y;}

2000 sum: add a0,a0,a12004 jr ra # new instr. “jump register”

• Question:Whyuse jr here?Whynot usej?

• Answer:summightbecalledbymanyplaces,sowecan’treturntoafixedplace.Thecallingproctosummustbeabletosay“returnhere”somehow.

9/14/17 25

CRISC-V

InstructionSupportforFunctions(4/4)• Singleinstructiontojumpandsavereturnaddress:jumpandlink

(jal)• Before:

1008 addi ra,zero,1016 #ra=10161012 j sum #goto sum

• After:1008 jal sum # ra=1012,goto sum

• Whyhaveajal?– Makethecommoncasefast:functioncalls verycommon– Reduceprogramsize– Don’thavetoknowwhere codeis inmemorywithjal!

9/14/17 26

RISC-VFunctionCallInstructions• Invokefunction:jumpandlinkinstruction(jal)

(reallyshouldbelaj “linkandjump”)– “link”meansformanaddressorlinkthatpointsto

callingsitetoallowfunctiontoreturntoproperaddress– Jumpstoaddressandsimultaneouslysavestheaddressofthefollowing

instructioninregisterrajal FunctionLabel

• Returnfromfunction:jumpregisterinstruction(jr)– Unconditionaljumptoaddressspecifiedinregister:jr ra– Assemblershorthand:ret = jr ra

9/14/17 27

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 28

Exampleint Leaf

(int g, int h, int i, int j){

int f;f = (g + h) – (i + j);return f;

}• Parametervariablesg,h,i, andj inargumentregistersa0,a1,

a2,anda3,andf ins0• Assumeneedonetemporaryregisters1

9/14/17 29

WhereAreOldRegisterValuesSavedtoRestoreThemAfterFunctionCall?• Needaplacetosaveoldvaluesbeforecallfunction,restore

themwhenreturn,anddelete• Idealisstack:last-in-first-outqueue

(e.g.,stackofplates)– Push:placingdataontostack– Pop:removingdatafromstack

• Stackinmemory,soneedregistertopointtoit• sp isthestackpointerinRISC-V(x2)• Conventionisgrowstackdownfromhightolowaddresses

– Push decrementssp,Pop incrementssp9/14/17 30

RISC-VCodeforLeaf()Leaf: addi sp,sp,-8 # adjust stack for 2 items

sw s1, 4(sp) # save s1 for use afterwardssw s0, 0(sp) # save s0 for use afterwards

add s0,a0,a1 # f = g + hadd s1,a2,a3 # s1 = i + jsub a0,s0,s1 # return value (g + h) – (i + j)

lw s0, 0(sp) # restore register s0 for caller lw s1, 4(sp) # restore register s1 for calleraddi sp,sp,8 # adjust stack to delete 2 itemsjr ra # jump back to calling routine

9/14/17 31

StackBefore,During,AfterFunction• Needtosaveoldvaluesofs0 ands1

9/14/17 32

sp

Beforecall

spSaved s1

Duringcall

Saved s0

sp

Aftercall

Saved s1Saved s0

Administrivia• HW1isout!Getstartedearly.• CandMemoryManagementGuerrillaSessionistonight7-9pmin293Cory

• Smallgrouptutoringsessionshavelaunched

9/14/17 33

NewRISC-Vbook!• “TheRISC-VReader”,DavidPatterson,

AndrewWaterman

• Availableat• https://www.createspace.com/7439283

• Earlyprintedition$9.99• Kindleeditiontofollowatsomepoint

• Recommended,notrequired

34

Break!

9/14/17 35

WhatIfaFunctionCallsaFunction?RecursiveFunctionCalls?

• Wouldclobbervaluesina0-a7 andra• Whatisthesolution?

9/14/17 36

NestedProcedures(1/2)int sumSquare(int x, int y) {return mult(x,x)+ y;}

• SomethingcalledsumSquare,nowsumSquare iscallingmult

• Sothere’savalueinra thatsumSquare wantstojumpbackto,butthiswillbeoverwrittenbythecalltomult

NeedtosavesumSquare returnaddressbeforecalltomult

9/14/17 37

NestedProcedures(2/2)• Ingeneral,mayneedtosavesomeotherinfoinadditiontora.

• WhenaCprogramisrun,therearethreeimportantmemoryareasallocated:– Static:Variablesdeclaredonceperprogram,ceasetoexistonlyafterexecutioncompletes- e.g.,Cglobals

– Heap:Variablesdeclareddynamicallyviamalloc– Stack:Spacetobeusedbyprocedureduringexecution;thisiswherewecansaveregistervalues

389/14/17

OptimizedFunctionConventionToreduceexpensiveloadsandstoresfromspillingandrestoringregisters,RISC-Vfunction-callingconventiondividesregistersintotwocategories:

1. Preservedacrossfunctioncall– Callercanrelyonvaluesbeingunchanged– sp,gp,tp, “savedregisters”s0- s11 (s0 isalso fp)

2. Notpreservedacrossfunctioncall– Callercannotrelyonvaluesbeingunchanged– Argument/returnregistersa0-a7,ra,“temporary

registers”t0-t69/14/17 39

PeerInstruction• WhichstatementisFALSE?• RED:RISC-Vusesjal toinvokeafunctionandjr toreturnfromafunction

• GREEN: jal savesPC+1inra• ORANGE: Thecallee canusetemporaryregisters(ti)

withoutsavingandrestoringthem: Thecallercanrelyonsaveregisters(si)

withoutfearofcallee changingthem

9/14/17 40

PeerInstruction• WhichstatementisFALSE?• RED:RISC-Vusesjal toinvokeafunctionandjr toreturnfromafunction

• GREEN: jal savesPC+1inra• ORANGE: Thecallee canusetemporaryregisters(ti)

withoutsavingandrestoringthem: Thecallercanrelyonsaveregisters(si)

withoutfearofcallee changingthem

9/14/17 41

AllocatingSpaceonStack• Chastwostorageclasses:automaticandstatic

– Automatic variablesarelocaltofunctionanddiscardedwhenfunctionexits

– Staticvariablesexistacrossexitsfromandentriestoprocedures

• Usestackforautomatic(local)variablesthatdon’tfitinregisters

• Procedureframeor activationrecord:segmentofstackwithsavedregistersandlocalvariables

9/14/17 42

StackBefore,During,AfterFunction

439/14/17

sp

Beforecall

sp

Duringcall

Savedargumentregisters(ifany)

Savedreturnaddress(ifneeded)

Savedsavedregisters(ifany)Localvariables

(ifany)

sp

Aftercall

UsingtheStack(1/2)• Sowehavearegistersp whichalwayspointstothelastusedspaceinthestack

• Tousestack,wedecrementthispointerbytheamountofspaceweneedandthenfillitwithinfo

• So,howdowecompilethis?int sumSquare(int x, int y) {

return mult(x,x)+ y;}

9/14/17 44

UsingtheStack(2/2)

45

sumSquare: addi sp,sp,-8 # space on stacksw ra, 4(sp) # save ret addrsw a1, 0(sp) # save ymv a1,a0 # mult(x,x)jal mult # call multlw a1, 0(sp) # restore yadd a0,a0,a1 # mult()+ylw ra, 4(sp) # get ret addraddi sp,sp,8 # restore stackjr ra

mult: ...

int sumSquare(int x, int y) {return mult(x,x)+ y; }

“push”

“pop”

9/14/17

WhereistheStackinMemory?• RV32convention(RV64andRV128havedifferentmemorylayouts)• Stackstartsinhighmemoryandgrowsdown

– Hexadecimal(base16):bfff_fff0hex– Stackmustbealignedon16-byteboundary(nottrueinexamplesabove)

• RV32programs(textsegment)inlowend– 0001_0000hex

• staticdatasegment(constantsandotherstaticvariables)abovetextforstaticvariables– RISC-Vconventionglobalpointer(gp)pointstostatic– RV32gp =1000_0000hex

• Heapabovestaticfordatastructuresthatgrowandshrink;growsuptohighaddresses

9/14/17 46

RV32MemoryAllocation

9/14/17 47

Outline• RISC-VISAandC-to-RISC-VReview• ProgramExecutionOverview• FunctionCall• FunctionCallExample• AndinConclusion…

9/14/17 48

AndinConclusion…• Functionscalledwithjal,returnwithjr ra.• Thestackisyourfriend:Useittosaveanythingyouneed.Just leaveitthewayyou

foundit!• Instructionsweknowsofar…

Arithmetic:add, addi, subMemory: lw, sw, lb, lbu, sbDecision:beq, bne, blt, bgeUnconditionalBranches(Jumps):j, jal, jr

• Registersweknowsofar– Allofthem!– a0-a7forfunctionarguments,a0-a1forreturnvalues– sp,stackpointer, ra returnaddress– s0-s11savedregisters– t0-t6temporaries– zero

499/14/17

top related