173 lines
3.0 KiB
Plaintext
173 lines
3.0 KiB
Plaintext
#/* $begin ncopy-ys */
|
|
##################################################################
|
|
# ncopy.ys - Copy a src block of len words to dst.
|
|
# Return the number of positive words (>0) contained in src.
|
|
#
|
|
# Include your name and ID here.
|
|
#
|
|
# Describe how and why you modified the baseline code.
|
|
#
|
|
##################################################################
|
|
# Do not modify this portion
|
|
# Function prologue.
|
|
# %rdi = src, %rsi = dst, %rdx = len
|
|
ncopy:
|
|
|
|
##################################################################
|
|
# You can modify this portion
|
|
|
|
xorq %rax, %rax
|
|
iaddq $0xfffffffffffffff7, %rdx
|
|
jle Tail
|
|
|
|
Loop:
|
|
mrmovq (%rdi), %r10
|
|
rmmovq %r10, (%rsi)
|
|
andq %r10, %r10
|
|
jle F1
|
|
iaddq $1, %rax
|
|
F1:
|
|
mrmovq 8(%rdi), %r10
|
|
rmmovq %r10, 8(%rsi)
|
|
andq %r10, %r10
|
|
jle F2
|
|
iaddq $1, %rax
|
|
F2:
|
|
mrmovq 16(%rdi), %r10
|
|
rmmovq %r10, 16(%rsi)
|
|
andq %r10, %r10
|
|
jle F3
|
|
iaddq $1, %rax
|
|
F3:
|
|
mrmovq 24(%rdi), %r10
|
|
rmmovq %r10, 24(%rsi)
|
|
andq %r10, %r10
|
|
jle F4
|
|
iaddq $1, %rax
|
|
F4:
|
|
mrmovq 32(%rdi), %r10
|
|
rmmovq %r10, 32(%rsi)
|
|
andq %r10, %r10
|
|
jle F5
|
|
iaddq $1, %rax
|
|
F5:
|
|
mrmovq 40(%rdi), %r10
|
|
rmmovq %r10, 40(%rsi)
|
|
andq %r10, %r10
|
|
jle F6
|
|
iaddq $1, %rax
|
|
F6:
|
|
mrmovq 48(%rdi), %r10
|
|
rmmovq %r10, 48(%rsi)
|
|
andq %r10, %r10
|
|
jle F7
|
|
iaddq $1, %rax
|
|
F7:
|
|
mrmovq 56(%rdi), %r10
|
|
rmmovq %r10, 56(%rsi)
|
|
andq %r10, %r10
|
|
jle F8
|
|
iaddq $1, %rax
|
|
F8:
|
|
mrmovq 64(%rdi), %r10
|
|
rmmovq %r10, 64(%rsi)
|
|
andq %r10, %r10
|
|
jle F9
|
|
iaddq $1, %rax
|
|
F9:
|
|
mrmovq 72(%rdi), %r10
|
|
rmmovq %r10, 72(%rsi)
|
|
andq %r10, %r10
|
|
jle F10
|
|
iaddq $1, %rax
|
|
F10:
|
|
iaddq $80, %rdi
|
|
iaddq $80, %rsi
|
|
iaddq $0xfffffffffffffff6, %rdx
|
|
jg Loop
|
|
|
|
Tail:
|
|
addq %rdx, %rdx
|
|
addq %rdx, %rdx
|
|
addq %rdx, %rdx
|
|
mrmovq JT(%rdx), %rdx
|
|
pushq %rdx
|
|
ret
|
|
|
|
.quad Done
|
|
.quad J1
|
|
.quad J2
|
|
.quad J3
|
|
.quad J4
|
|
.quad J5
|
|
.quad J6
|
|
.quad J7
|
|
.quad J8
|
|
JT:
|
|
.quad J9
|
|
|
|
J9:
|
|
mrmovq 64(%rdi), %r10
|
|
rmmovq %r10, 64(%rsi)
|
|
andq %r10, %r10
|
|
jle J8
|
|
iaddq $1, %rax
|
|
J8:
|
|
mrmovq 56(%rdi), %r10
|
|
rmmovq %r10, 56(%rsi)
|
|
andq %r10, %r10
|
|
jle J7
|
|
iaddq $1, %rax
|
|
J7:
|
|
mrmovq 48(%rdi), %r10
|
|
rmmovq %r10, 48(%rsi)
|
|
andq %r10, %r10
|
|
jle J6
|
|
iaddq $1, %rax
|
|
J6:
|
|
mrmovq 40(%rdi), %r10
|
|
rmmovq %r10, 40(%rsi)
|
|
andq %r10, %r10
|
|
jle J5
|
|
iaddq $1, %rax
|
|
J5:
|
|
mrmovq 32(%rdi), %r10
|
|
rmmovq %r10, 32(%rsi)
|
|
andq %r10, %r10
|
|
jle J4
|
|
iaddq $1, %rax
|
|
J4:
|
|
mrmovq 24(%rdi), %r10
|
|
rmmovq %r10, 24(%rsi)
|
|
andq %r10, %r10
|
|
jle J3
|
|
iaddq $1, %rax
|
|
J3:
|
|
mrmovq 16(%rdi), %r10
|
|
rmmovq %r10, 16(%rsi)
|
|
andq %r10, %r10
|
|
jle J2
|
|
iaddq $1, %rax
|
|
J2:
|
|
mrmovq 8(%rdi), %r10
|
|
rmmovq %r10, 8(%rsi)
|
|
andq %r10, %r10
|
|
jle J1
|
|
iaddq $1, %rax
|
|
J1:
|
|
mrmovq (%rdi), %r10
|
|
rmmovq %r10, (%rsi)
|
|
andq %r10, %r10
|
|
jle Done
|
|
iaddq $1, %rax
|
|
|
|
##################################################################
|
|
# Do not modify the following section of code
|
|
# Function epilogue.
|
|
Done:
|
|
ret
|
|
##################################################################
|
|
# Keep the following label at the end of your function
|
|
End:
|
|
#/* $end ncopy-ys */
|