    .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
