264 lines
4.7 KiB
Plaintext
264 lines
4.7 KiB
Plaintext
#######################################################################
|
|
# Test for copying block of size 63;
|
|
#######################################################################
|
|
.pos 0
|
|
main: irmovq Stack, %rsp # Set up stack pointer
|
|
|
|
# Set up arguments for copy function and then invoke it
|
|
irmovq $63, %rdx # src and dst have 63 elements
|
|
irmovq dest, %rsi # dst array
|
|
irmovq src, %rdi # src array
|
|
call ncopy
|
|
halt # should halt with num nonzeros in %rax
|
|
StartFun:
|
|
#/* $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
|
|
# Loop header
|
|
xorq %rax,%rax # count = 0;
|
|
iaddq $0xfffffffffffffffc, %rdx
|
|
jle Tail # if so, goto Done:
|
|
|
|
Loop1:
|
|
mrmovq (%rdi), %r10 # read val from src...
|
|
rmmovq %r10, (%rsi) # ...and store it to dst
|
|
andq %r10, %r10 # val <= 0?
|
|
jle Npos1 # if so, goto Npos:
|
|
iaddq $1, %rax # count++
|
|
Npos1:
|
|
|
|
mrmovq 8(%rdi), %r10 # read val from src...
|
|
rmmovq %r10, 8(%rsi) # ...and store it to dst
|
|
andq %r10, %r10 # val <= 0?
|
|
jle Npos2 # if so, goto Npos:
|
|
iaddq $1, %rax # count++
|
|
Npos2:
|
|
|
|
mrmovq 16(%rdi), %r10 # read val from src...
|
|
rmmovq %r10, 16(%rsi) # ...and store it to dst
|
|
andq %r10, %r10 # val <= 0?
|
|
jle Npos3 # if so, goto Npos:
|
|
iaddq $1, %rax # count++
|
|
Npos3:
|
|
|
|
mrmovq 24(%rdi), %r10 # read val from src...
|
|
rmmovq %r10, 24(%rsi) # ...and store it to dst
|
|
andq %r10, %r10 # val <= 0?
|
|
jle Npos4 # if so, goto Npos:
|
|
iaddq $1, %rax # count++
|
|
Npos4:
|
|
|
|
mrmovq 32(%rdi), %r10 # read val from src...
|
|
rmmovq %r10, 32(%rsi) # ...and store it to dst
|
|
andq %r10, %r10 # val <= 0?
|
|
jle Npos5 # if so, goto Npos:
|
|
iaddq $1, %rax # count++
|
|
Npos5:
|
|
|
|
iaddq $40, %rdi # src++
|
|
iaddq $40, %rsi # dst++
|
|
iaddq $0xfffffffffffffffb, %rdx # len--
|
|
jg Loop1
|
|
|
|
Tail:
|
|
iaddq $4, %rdx
|
|
jle Done
|
|
Loop2:
|
|
mrmovq (%rdi), %r10
|
|
rmmovq %r10, (%rsi)
|
|
andq %r10, %r10
|
|
jle NposT
|
|
iaddq $1, %rax
|
|
NposT:
|
|
iaddq $8, %rdi
|
|
iaddq $8, %rsi
|
|
iaddq $0xffffffffffffffff, %rdx
|
|
jg Loop2
|
|
|
|
|
|
##################################################################
|
|
# 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 */
|
|
EndFun:
|
|
|
|
###############################
|
|
# Source and destination blocks
|
|
###############################
|
|
.align 8
|
|
src:
|
|
.quad 1
|
|
.quad 2
|
|
.quad -3
|
|
.quad -4
|
|
.quad -5
|
|
.quad 6
|
|
.quad -7
|
|
.quad 8
|
|
.quad 9
|
|
.quad -10
|
|
.quad 11
|
|
.quad 12
|
|
.quad -13
|
|
.quad 14
|
|
.quad -15
|
|
.quad 16
|
|
.quad -17
|
|
.quad -18
|
|
.quad 19
|
|
.quad -20
|
|
.quad 21
|
|
.quad -22
|
|
.quad -23
|
|
.quad -24
|
|
.quad -25
|
|
.quad -26
|
|
.quad 27
|
|
.quad -28
|
|
.quad -29
|
|
.quad -30
|
|
.quad 31
|
|
.quad -32
|
|
.quad 33
|
|
.quad -34
|
|
.quad 35
|
|
.quad 36
|
|
.quad -37
|
|
.quad 38
|
|
.quad 39
|
|
.quad 40
|
|
.quad 41
|
|
.quad -42
|
|
.quad 43
|
|
.quad 44
|
|
.quad 45
|
|
.quad 46
|
|
.quad 47
|
|
.quad 48
|
|
.quad 49
|
|
.quad 50
|
|
.quad 51
|
|
.quad -52
|
|
.quad -53
|
|
.quad 54
|
|
.quad -55
|
|
.quad -56
|
|
.quad 57
|
|
.quad -58
|
|
.quad -59
|
|
.quad -60
|
|
.quad -61
|
|
.quad -62
|
|
.quad -63
|
|
.quad 0xbcdefa # This shouldn't get moved
|
|
|
|
.align 16
|
|
Predest:
|
|
.quad 0xbcdefa
|
|
dest:
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
.quad 0xcdefab
|
|
Postdest:
|
|
.quad 0xdefabc
|
|
|
|
.align 8
|
|
# Run time stack
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
.quad 0
|
|
|
|
Stack:
|