CSAPP-sol/arch/sim/pipe/ncopy.ys

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 Remaining
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
Remaining:
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 */