lecture 9: mips instruction set today’s topic –full example –spim simulator 1
TRANSCRIPT
![Page 1: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/1.jpg)
Lecture 9: MIPS Instruction Set
• Today’s topic– Full example– SPIM Simulator
1
![Page 2: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/2.jpg)
2
Full Example – Sort in C
• Allocate registers to program variables• Produce code for the program body• Preserve registers across procedure invocations
void sort (int v[], int n){ int i, j; for (i=0; i<n; i+=1) { for (j=i-1; j>=0 && v[j] > v[j+1]; j-=1) { swap (v,j); } }}
void swap (int v[], int k){ int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp;}
![Page 3: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/3.jpg)
3
The swap Procedure
• Allocate registers to program variables• Produce code for the program body• Preserve registers across procedure invocations
void swap (int v[], int k){ int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp;}
![Page 4: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/4.jpg)
The Procedure Swap
swap: sll $t1, $a1, 2 # $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v+(k*4) # (address of v[k]) lw $t0, 0($t1) # $t0 (temp) = v[k] lw $t2, 4($t1) # $t2 = v[k+1] sw $t2, 0($t1) # v[k] = $t2 (v[k+1]) sw $t0, 4($t1) # v[k+1] = $t0 (temp) jr $ra # return to calling routine
• Register allocation: $a0 and $a1 for the two arguments, $t0 for the temp variable – no need for saves and restores as we’re not using $s0-$s7 and this is a leaf procedure (won’t need to re-use $a0 and $a1)
4
![Page 5: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/5.jpg)
5
The sort Procedure
• Register allocation: arguments v and n use $a0 and $a1, i and j use $s0 and $s1
for (i=0; i<n; i+=1) { for (j=i-1; j>=0 && v[j] > v[j+1]; j-=1) { swap (v,j); }}
![Page 6: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/6.jpg)
6
The sort Procedure
• Register allocation: arguments v and n use $a0 and $a1, i and j use $s0 and $s1; must save $a0, $a1, and $ra before calling the leaf procedure
• The outer for loop looks like this: (note the use of pseudo-instrs)
move $s0, $zero # initialize the looploopbody1: bge $s0, $a1, exit1 # will eventually use slt and beq … body of inner loop … addi $s0, $s0, 1 j loopbody1exit1:
for (i=0; i<n; i+=1) { for (j=i-1; j>=0 && v[j] > v[j+1]; j-=1) { swap (v,j); }}
![Page 7: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/7.jpg)
7
The sort Procedure
• The inner for loop looks like this:
addi $s1, $s0, -1 # initialize the looploopbody2: blt $s1, $zero, exit2 # will eventually use slt and beq sll $t1, $s1, 2 add $t2, $a0, $t1 lw $t3, 0($t2) lw $t4, 4($t2) bge $t4, $t3, exit2 … body of inner loop … addi $s1, $s1, -1 j loopbody2exit2: for (i=0; i<n; i+=1) {
for (j=i-1; j>=0 && v[j] > v[j+1]; j-=1) { swap (v,j); }}
![Page 8: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/8.jpg)
The Procedure Body
move $s2, $a0 # save $a0 into $s2 move $s3, $a1 # save $a1 into $s3 move $s0, $zero # i = 0for1tst: slt $t0, $s0, $s3 # $t0 = 0 if $s0 ≥ $s3 (i ≥ n) beq $t0, $zero, exit1 # go to exit1 if $s0 ≥ $s3 (i ≥ n) addi $s1, $s0, –1 # j = i – 1for2tst: slti $t0, $s1, 0 # $t0 = 1 if $s1 < 0 (j < 0) bne $t0, $zero, exit2 # go to exit2 if $s1 < 0 (j < 0) sll $t1, $s1, 2 # $t1 = j * 4 add $t2, $s2, $t1 # $t2 = v + (j * 4) lw $t3, 0($t2) # $t3 = v[j] lw $t4, 4($t2) # $t4 = v[j + 1] slt $t0, $t4, $t3 # $t0 = 0 if $t4 ≥ $t3 beq $t0, $zero, exit2 # go to exit2 if $t4 ≥ $t3 move $a0, $s2 # 1st param of swap is v (old $a0) move $a1, $s1 # 2nd param of swap is j jal swap # call swap procedure addi $s1, $s1, –1 # j –= 1 j for2tst # jump to test of inner loopexit2: addi $s0, $s0, 1 # i += 1 j for1tst # jump to test of outer loop
Passparams& call
Moveparams
Inner loop
Outer loop
Inner loop
Outer loop
8
![Page 9: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/9.jpg)
9
Saves and Restores
• Since we repeatedly call “swap” with $a0 and $a1, we begin “sort” by copying its arguments into $s2 and $s3 – must update the rest of the code in “sort” to use $s2 and $s3 instead of $a0 and $a1
• Must save $ra at the start of “sort” because it will get over-written when we call “swap”
• Must also save $s0-$s3 so we don’t overwrite something that belongs to the procedure that called “sort”
• See page 155 in textbook for complete program code
![Page 10: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/10.jpg)
10
Saves and Restores
sort: addi $sp, $sp, -20 sw $ra, 16($sp) sw $s3, 12($sp) sw $s2, 8($sp) sw $s1, 4($sp) sw $s0, 0($sp) move $s2, $a0 move $s3, $a1 … move $a0, $s2 # the inner loop body starts here move $a1, $s1 jal swap …exit1: lw $s0, 0($sp) … addi $sp, $sp, 20 jr $ra
9 lines of C code 35 lines of assembly
for (i=0; i<n; i+=1) { for (j=i-1; j>=0 && v[j] > v[j+1]; j-=1) { swap (v,j); }}
![Page 11: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/11.jpg)
sort: addi $sp,$sp, –20 # make room on stack for 5 registers sw $ra, 16($sp) # save $ra on stack sw $s3,12($sp) # save $s3 on stack sw $s2, 8($sp) # save $s2 on stack sw $s1, 4($sp) # save $s1 on stack sw $s0, 0($sp) # save $s0 on stack … # procedure body … exit1: lw $s0, 0($sp) # restore $s0 from stack lw $s1, 4($sp) # restore $s1 from stack lw $s2, 8($sp) # restore $s2 from stack lw $s3,12($sp) # restore $s3 from stack lw $ra,16($sp) # restore $ra from stack addi $sp,$sp, 20 # restore stack pointer jr $ra # return to calling routine
The Full Procedure
11
![Page 12: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/12.jpg)
12
Relative Performance
Gcc optimization Relative Cycles Instruction CPI performance count
none 1.00 159K 115K 1.38 O1 2.37 67K 37K 1.79 O2 2.38 67K 40K 1.66 O3 2.41 66K 45K 1.46
• A Java interpreter has relative performance of 0.12, while the Jave just-in-time compiler has relative performance of 2.13
• Note that the quicksort algorithm is about three orders of magnitude faster than the bubble sort algorithm (for 100K elements)
![Page 13: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/13.jpg)
13
SPIM
• SPIM is a simulator that reads in an assembly program and models its behavior on a MIPS processor
• Note that a “MIPS add instruction” will eventually be converted to an add instruction for the host computer’s architecture – this translation happens under the hood
• To simplify the programmer’s task, it accepts pseudo-instructions, large constants, constants in decimal/hex formats, labels, etc.
• The simulator allows us to inspect register/memory values to confirm that our program is behaving correctly
![Page 14: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/14.jpg)
14
Example
This simple program (similar to what we’ve written in class) will runon SPIM (a “main” label is introduced so SPIM knows where to start)
main: addi $t0, $zero, 5 addi $t1, $zero, 7 add $t2, $t0, $t1
If we inspect the contents of $t2, we’ll find the number 12
![Page 15: Lecture 9: MIPS Instruction Set Today’s topic –Full example –SPIM Simulator 1](https://reader036.vdocuments.us/reader036/viewer/2022072004/56649c765503460f9492a4d5/html5/thumbnails/15.jpg)
15
User Interface
main: addi $t0, $zero, 5 addi $t1, $zero, 7 add $t2, $t0, $t1
File add.shassan@trust > spim
(spim) read “add.s”(spim) run(spim) print $10 Reg 10 = 0x0000000c (12)(spim) reinitialize(spim) read “add.s”(spim) step(spim) print $8 Reg 8 = 0x00000005 (5)(spim) print $9 Reg 9 = 0x00000000 (0)(spim) step(spim) print $9 Reg 9 = 0x00000007 (7)(spim) exit