## LSU EE 4720 -- Computer Architecture # # MIPS program that computes pi. # # Intended to demonstrate floating-point MIPS instructions. (If your # goal is to compute pi to great precision, for example, # 3.14159265358979323846264338327950288419716939937510582097494, then # this program is NOT the way to do it, there are much faster ways.) # # Equivalent C++ Code: # # double sum = 0, i = 1; # # while ( i < 50000000 ) # { # sum = sum + 4.0 / i; i += 2; # sum = sum - 4.0 / i; i += 2; # } # printf("After %.0f iterations sum = %.8f\n", i, sum); .data ITERATIONS: .double 50000000.0 MSG: .asciiz "After %/f0/.0f iterations sum = %/f2/.8f\n"; .text .globl __start __start: addi $t1, $0, 1 mtc1 $t1, $f0 cvt.d.w $f0, $f0 # f0 -> i add.d $f12, $f0, $f0 # f12 <- 2 (constant) add.d $f14, $f12, $f12 # f14 <- 4 (constant) la $t2, ITERATIONS ldc1 $f16, 0($t2) # f16 -> number of iterations. sub.d $f2, $f0, $f0 # f2 -> sum <- 0 initialize LOOP: div.d $f4, $f14, $f0 # 4.0 / i add.d $f0, $f0, $f12 # i+=2 add.d $f2, $f2, $f4 # sum += 4.0/i div.d $f4, $f14, $f0 # 4.0 / i add.d $f0, $f0, $f12 # i+=2 c.lt.d $f0, $f16 bc1t LOOP sub.d $f2, $f2, $f4 # sum -= 4.0/i div.d $f16, $f16, $f12 addi $v0, $0, 11 la $a0, MSG syscall addi $v0, $0, 10 syscall