## 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