26 lines
775 B
ArmAsm
26 lines
775 B
ArmAsm
.globl add64
|
|
|
|
.text
|
|
|
|
# > When primitive arguments twice the size of a pointer-word are passed on the
|
|
# > stack, they are naturally aligned. When they are passed in the integer
|
|
# > registers, they reside in an aligned even-odd register pair, with the even
|
|
# > register holding the least-significant bits.
|
|
|
|
# 64-bit integer addition
|
|
# arguments:
|
|
# a0: x lower 32 bits
|
|
# a1: x upper 32 bits
|
|
# a2: y lower 32 bits
|
|
# a3: y upper 32 bits
|
|
# return:
|
|
# a0: x+y lower 32 bits
|
|
# a1: x+y upper 32 bits
|
|
#
|
|
add64:
|
|
add a0, a0, a2 # add lower 32 bits
|
|
add t0, a1, a3 # add upper 32 bits
|
|
sltu t1, a0, a2 # if lower 32-bit sum < a2 then set t1=1 (carry bit)
|
|
add a1, t0, t1 # upper 32 bits of answer (upper sum + carry bit)
|
|
ret
|
|
|