.data msg: .asciz "Sum abs pairwise diffs: " .text .globl main # float sum_abs_pairwise(float* p, int N) # a0 = p (base pointer), a1 = N sum_abs_pairwise: fmv.s.x ft3, zero # ft3 = s = 0.0 slli a2, a1, 2 # a2 = Nb = N*4 (bytes) add t2, a0, a2 # t2 = end = p + Nb addi t3, t2, -4 # t3 = end - 4 (last valid pi) mv t0, a0 # t0 = pi (byte pointer) outer_loop: sltu t4, t0, t3 # t4 = (pi < end-4)? beq t4, zero, done # if not, finish addi t1, t0, 4 # t1 = pj = pi + 4 inner_loop: sltu t5, t1, t2 # t5 = (pj < end)? beq t5, zero, next_i # if not, advance pi flw ft0, 0(t0) # ft0 = *pi flw ft1, 0(t1) # ft1 = *pj fsub.s ft2, ft0, ft1 # ft2 = *pi - *pj fabs.s ft2, ft2 # ft2 = |ft2| fadd.s ft3, ft3, ft2 # s += |*pi - *pj| addi t1, t1, 4 # pj += 1 (in bytes) b inner_loop next_i: addi t0, t0, 4 # pi += 1 (in bytes) b outer_loop done: fmv.s fa0, ft3 # return s ret # ------------------------------------------------------------- main: li a1, 6 # N = 6 slli a0, a1, 2 # a0 = N*sizeof(float) bytes li a7, 9 # sbrk ecall mv s0, a0 # s0 = p (base) # Build constant -4.5f = (-45)/10 li t2, -45 fcvt.s.w ft1, t2 # -45.0 li t3, 10 fcvt.s.w ft2, t3 # 10.0 fdiv.s ft5, ft1, ft2 # ft5 = -4.5 # Initialize via pointer: *ptr = (float)k - 4.5 mv t6, s0 # t6 = ptr li t4, 0 # k = 0 init_loop: beq t4, a1, init_done # if k==N break fcvt.s.w ft0, t4 # float(k) fadd.s ft0, ft0, ft5 # k - 4.5 fsw ft0, 0(t6) # *ptr = value addi t6, t6, 4 # ptr++ addi t4, t4, 1 # k++ b init_loop init_done: # Call sum_abs_pairwise(p, N) mv a0, s0 li a1, 6 jal sum_abs_pairwise # fa0 = result # Print label la a0, msg li a7, 4 ecall # Print float (fa0) li a7, 2 ecall # Exit li a7, 10 ecall