################################################################################ ## ## LSU EE 4720 Spring 2004 Homework 1 Solution ## ## ## Assignment: http://www.ece.lsu.edu/ee4720/2004/hw01.pdf ################################################################################ ## Problem 1 Solution # When the routine below is called register $a0 has the address of a # null-terminated string. # # When the routine returns register $v0 should hold the number of # words in the string. For purposes of this problem a word consists # of a group of any characters except a space. There can be one or more # spaces between words. For simplicity, only consider a space (ASCII 32), # ignore tabs, linefeeds, and other whitespace characters. ## Register Usage # # $a0: Procedure argument: pointer to string. # $v0: Return value: number of words in the string. # [x] Code should run quickly. # [x] Can modify registers $a0-$a3, $t0-$t9 and $v0 only. # [x] Do not modify $s0-$s7, $sp, $fp, or $ra # [x] Fill as many delay slots as possible. wc: add $v0, $0, $0 # Initialize count. addi $t1, $0, 32 # Blank # Loop until non-blank found. BLOOP: lb $t0, 0($a0) # Load character BLOOPT: beq $t0, $t1, BLOOP # Continue if blank. addi $a0, $a0, 1 # Non-blank found, increment word count, then find a blank. beq $t0, $0, EOS # Check for end of string. lb $t0, 0($a0) addi $v0, $v0, 1 # Increment word count. # Loop until blank found. WLOOP: beq $t0, $t1, BLOOP addi $a0, $a0, 1 bne $t0, $0, WLOOP lb $t0, 0($a0) EOS: jr $ra nop ################################################################################ ## Problem 2 Solution # The difference in performance is due to the different compilers used # for preparing the benchmarks. # # According to the disclosures, the two systems have identical # hardware however the benchmark suites were prepared using different # compilers (or different versions of the same compiler, but they're # still different). # The better system uses what looks like the next version of the same # compiler. No doubt the newer compiler can do new optimizations, but # these optimizations can only be used on certain pieces of code. # Some of the benchmarks have pieces of code that can benefit from the # new optimizations, while some benchmarks do not have such pieces of # code (or do not have them in frequently executed areas).