First stab at the misaligned test.

This commit is contained in:
Rose Thompson 2023-10-31 12:30:10 -05:00
parent 2241976d29
commit c061440141
2 changed files with 1205 additions and 96 deletions

View File

@ -1,24 +1,537 @@
00000000
00000000
00000001
00000000
ffffffff
ffffffff
00000001
00000000
00000002
03020100 # ByteDstData
07060504
0b0a0908
0f0e0d0c
13021110
17161514
1b1a1918
1f1e1d1c
23222120
27262524
2b2a2928
2f2e2d2c
33023130
37363534
3b3a3938
3f3e3d3c
43424140
47464544
4b4a4948
4f4e4d4c
53025150
57565554
5b5a5958
5f5e5d5c
63626160
67666564
6b6a6968
6f6e6d6c
73027170
77767574
7b7a7978
7f7e7d7c
03020100 # Half0DstData
07060504
0b0a0908
0f0e0d0c
13021110
17161514
1b1a1918
1f1e1d1c
23222120
27262524
2b2a2928
2f2e2d2c
33023130
37363534
3b3a3938
3f3e3d3c
43424140
47464544
4b4a4948
4f4e4d4c
53025150
57565554
5b5a5958
5f5e5d5c
63626160
67666564
6b6a6968
6f6e6d6c
73027170
77767574
7b7a7978
7f7e7d7c
04030201 # Half1DstData
08070605
0c0b0a09
100f0e0d
14130211
18171615
1c1b1a19
201f1e1d
24232221
28272625
2c2b2a29
302f2e2d
34330231
38373635
3c3b3a39
403f3e3d
44434241
48474645
4c4b4a49
504f4e4d
54530251
58575655
5c5b5a59
605f5e5d
64636261
68676665
6c6b6a69
706f6e6d
74730271
78777675
7c7b7a79
de7f7e7d
03020100 # Word0DstData
07060504
0b0a0908
0f0e0d0c
13021110
17161514
1b1a1918
1f1e1d1c
23222120
27262524
2b2a2928
2f2e2d2c
33023130
37363534
3b3a3938
3f3e3d3c
43424140
47464544
4b4a4948
4f4e4d4c
53025150
57565554
5b5a5958
5f5e5d5c
63626160
67666564
6b6a6968
6f6e6d6c
73027170
77767574
7b7a7978
7f7e7d7c
04030201 # Word1DstData
08070605
0c0b0a09
100f0e0d
14130211
18171615
1c1b1a19
201f1e1d
24232221
28272625
2c2b2a29
302f2e2d
34330231
38373635
3c3b3a39
403f3e3d
44434241
48474645
4c4b4a49
504f4e4d
54530251
58575655
5c5b5a59
605f5e5d
64636261
68676665
6c6b6a69
706f6e6d
74730271
78777675
7c7b7a79
de7f7e7d
05040302 # Word2DstData
09080706
0d0c0b0a
11100f0e
15141302
19181716
1d1c1b1a
21201f1e
25242322
29282726
2d2c2b2a
31302f2e
35343302
39383736
3d3c3b3a
41403f3e
45444342
49484746
4d4c4b4a
51504f4e
55545302
59585756
5d5c5b5a
61605f5e
65646362
69686766
6d6c6b6a
71706f6e
75747302
79787776
7d7c7b7a
dead7f7e
06050403 # Word3DstData
0a090807
0e0d0c0b
0211100f
16151413
1a191817
1e1d1c1b
2221201f
26252423
2a292827
2e2d2c2b
0231302f
36353433
3a393837
3e3d3c3b
4241403f
46454443
4a494847
4e4d4c4b
0251504f
56555453
5a595857
5e5d5c5b
6261605f
66656463
6a696867
6e6d6c6b
0271706f
76757473
7a797877
7e7d7c7b
deadbe7f
03020100 # Double0DstData
07060504
0b0a0908
0f0e0d0c
13021110
17161514
1b1a1918
1f1e1d1c
23222120
27262524
2b2a2928
2f2e2d2c
33023130
37363534
3b3a3938
3f3e3d3c
43424140
47464544
4b4a4948
4f4e4d4c
53025150
57565554
5b5a5958
5f5e5d5c
63626160
67666564
6b6a6968
6f6e6d6c
73027170
77767574
7b7a7978
7f7e7d7c
04030201 # Double1DstData
08070605
0c0b0a09
100f0e0d
14130211
18171615
1c1b1a19
201f1e1d
24232221
28272625
2c2b2a29
302f2e2d
34330231
38373635
3c3b3a39
403f3e3d
44434241
48474645
4c4b4a49
504f4e4d
54530251
58575655
5c5b5a59
605f5e5d
64636261
68676665
6c6b6a69
706f6e6d
74730271
78777675
7c7b7a79
de7f7e7d
05040302 # Double2DstData
09080706
0d0c0b0a
11100f0e
15141302
19181716
1d1c1b1a
21201f1e
25242322
29282726
2d2c2b2a
31302f2e
35343302
39383736
3d3c3b3a
41403f3e
45444342
49484746
4d4c4b4a
51504f4e
55545302
59585756
5d5c5b5a
61605f5e
65646362
69686766
6d6c6b6a
71706f6e
75747302
79787776
7d7c7b7a
dead7f7e
06050403 # Double3DstData
0a090807
0e0d0c0b
0211100f
16151413
1a191817
1e1d1c1b
2221201f
26252423
2a292827
2e2d2c2b
0231302f
36353433
3a393837
3e3d3c3b
4241403f
46454443
4a494847
4e4d4c4b
0251504f
56555453
5a595857
5e5d5c5b
6261605f
66656463
6a696867
6e6d6c6b
0271706f
76757473
7a797877
7e7d7c7b
deadbe7f
07060504 # Double4DestData
0b0a0908
0f0e0d0c
13021110
17161514
1b1a1918
1f1e1d1c
23222120
27262524
2b2a2928
2f2e2d2c
33023130
37363534
3b3a3938
3f3e3d3c
43424140
47464544
4b4a4948
4f4e4d4c
53025150
57565554
5b5a5958
5f5e5d5c
63626160
67666564
6b6a6968
6f6e6d6c
73027170
77767574
7b7a7978
7f7e7d7c
deadbeef
08070605 # Double5DestData
0c0b0a09
100f0e0d
14130211
18171615
1c1b1a19
201f1e1d
24232221
28272625
2c2b2a29
302f2e2d
34330231
38373635
3c3b3a39
403f3e3d
44434241
48474645
4c4b4a49
504f4e4d
54530251
58575655
5c5b5a59
605f5e5d
64636261
68676665
6c6b6a69
706f6e6d
74730271
78777675
7c7b7a79
de7f7e7d
deadbeef
09080706 # Double6DstData
0d0c0b0a
11100f0e
15141302
19181716
1d1c1b1a
21201f1e
25242322
29282726
2d2c2b2a
31302f2e
35343302
39383736
3d3c3b3a
41403f3e
45444342
49484746
4d4c4b4a
51504f4e
55545302
59585756
5d5c5b5a
61605f5e
65646362
69686766
6d6c6b6a
71706f6e
75747302
79787776
7d7c7b7a
dead7f7e
deadbeef
0a090807 # Double7DstData
0e0d0c0b
0211100f
16151413
1a191817
1e1d1c1b
2221201f
26252423
2a292827
2e2d2c2b
0231302f
36353433
3a393837
3e3d3c3b
4241403f
46454443
4a494847
4e4d4c4b
0251504f
56555453
5a595857
5e5d5c5b
6261605f
66656463
6a696867
6e6d6c6b
0271706f
76757473
7a797877
7e7d7c7b
deadbe7f
deadbeef
00000000 #signature
00000000
00000000
00000000
ffffffff
ffffffff
00000000
00000000
00000000
fffffffe
ffffffff
393cb5d1
72ca6f49
7b12609b
245889d8
7f42ac28
af17a2d3
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00

View File

@ -27,113 +27,709 @@ rvtest_entry_point:
RVMODEL_BOOT
RVTEST_CODE_BEGIN
RVTEST_SIGBASE( x6, wally_signature)
RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;def NO_SAIL=True;",ld)
# Testcase 0: rs1:x18(0x0000000000000000), rs2:x9(0x0000000000000000), result rd:x5(0x0000000000000000)
li x18, MASK_XLEN(0x0000000000000000)
li x9, MASK_XLEN(0x0000000000000000)
SLT x5, x18, x9
sd x5, 0(x6)
# This test checks the misaligned load and stores work correctly and across D$ line spills.
# The general approach is to
# 1. load a region of memory using load doubles equal to two cache lines. And copy to a new
# region but using stores of bytes, half, word, or doubles. Each are repeated for all possible
# misaligned access. Bytes are always aligned, halves are 0, and 1, words are 0, 1, 2, and 3, and
# doubles are 0 through 7. Then the new region is compared against the reference region. Because
# of the misalignment the last few bytes will not be written so they will be some portion of deadbeef.
# The comparison is done using using same abyte, half, word, and double misaligned approach.
# Testcase 1: rs1:x8(0x0000000000000000), rs2:x25(0x0000000000000001), result rd:x31(0x0000000000000001)
li x8, MASK_XLEN(0x0000000000000000)
li x25, MASK_XLEN(0x0000000000000001)
SLT x31, x8, x25
sd x31, 8(x6)
la a3, signature # does not get overwritten by any functions
# Testcase 2: rs1:x16(0x0000000000000000), rs2:x12(0xffffffffffffffff), result rd:x20(0x0000000000000000)
li x16, MASK_XLEN(0x0000000000000000)
li x12, MASK_XLEN(0xffffffffffffffff)
SLT x20, x16, x12
sd x20, 16(x6)
# byte copy region. always naturally aligned
la a0, SourceData
la a1, ByteDstData
li a2, 16
jal ra, memcpy8_1
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData
la a1, ByteDstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData
la a1, Half0DstData
li a2, 16
jal ra, memcpy8_2
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData
la a1, Half0DstData
li a2, 16
jal ra, CheckAllWriteSignature
# Testcase 3: rs1:x10(0x0000000000000001), rs2:x22(0x0000000000000000), result rd:x12(0x0000000000000000)
li x10, MASK_XLEN(0x0000000000000001)
li x22, MASK_XLEN(0x0000000000000000)
SLT x12, x10, x22
sd x12, 24(x6)
la a0, SourceData+1
la a1, Half1DstData
li a2, 16
jal ra, memcpy8_2
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+1
la a1, Half1DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData
la a1, Word0DstData
li a2, 16
jal ra, memcpy8_4
# Testcase 4: rs1:x19(0x0000000000000001), rs2:x31(0x0000000000000001), result rd:x29(0x0000000000000000)
li x19, MASK_XLEN(0x0000000000000001)
li x31, MASK_XLEN(0x0000000000000001)
SLT x29, x19, x31
sd x29, 32(x6)
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData
la a1, Word0DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+1
la a1, Word1DstData
li a2, 16
jal ra, memcpy8_4
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+1
la a1, Word1DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+2
la a1, Word2DstData
li a2, 16
jal ra, memcpy8_4
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+2
la a1, Word2DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+3
la a1, Word3DstData
li a2, 16
jal ra, memcpy8_4
# Testcase 5: rs1:x21(0x0000000000000001), rs2:x28(0xffffffffffffffff), result rd:x20(0x0000000000000000)
li x21, MASK_XLEN(0x0000000000000001)
li x28, MASK_XLEN(0xffffffffffffffff)
SLT x20, x21, x28
sd x20, 40(x6)
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+3
la a1, Word3DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData
la a1, Double0DstData
li a2, 16
jal ra, memcpy8_8
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData
la a1, Double0DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+1
la a1, Double1DstData
li a2, 16
jal ra, memcpy8_8
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+1
la a1, Double1DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+2
la a1, Double2DstData
li a2, 16
jal ra, memcpy8_8
# Testcase 6: rs1:x5(0xffffffffffffffff), rs2:x23(0x0000000000000000), result rd:x10(0x0000000000000001)
li x5, MASK_XLEN(0xffffffffffffffff)
li x23, MASK_XLEN(0x0000000000000000)
SLT x10, x5, x23
sd x10, 48(x6)
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+2
la a1, Double2DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+3
la a1, Double3DstData
li a2, 16
jal ra, memcpy8_8
# Testcase 7: rs1:x13(0xffffffffffffffff), rs2:x24(0x0000000000000001), result rd:x14(0x0000000000000001)
li x13, MASK_XLEN(0xffffffffffffffff)
li x24, MASK_XLEN(0x0000000000000001)
SLT x14, x13, x24
sd x14, 56(x6)
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+3
la a1, Double3DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+4
la a1, Double4DstData
li a2, 16
jal ra, memcpy8_8
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+4
la a1, Double4DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+5
la a1, Double5DstData
li a2, 16
jal ra, memcpy8_8
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+5
la a1, Double5DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+6
la a1, Double6DstData
li a2, 16
jal ra, memcpy8_8
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+6
la a1, Double6DstData
li a2, 16
jal ra, CheckAllWriteSignature
la a0, SourceData+7
la a1, Double7DstData
li a2, 16
jal ra, memcpy8_8
# Testcase 8: rs1:x27(0xffffffffffffffff), rs2:x21(0xffffffffffffffff), result rd:x3(0x0000000000000000)
li x27, MASK_XLEN(0xffffffffffffffff)
li x21, MASK_XLEN(0xffffffffffffffff)
SLT x3, x27, x21
sd x3, 64(x6)
# check if the values are write for all sizes and offsets of misaligned loads.
la a0, SourceData+7
la a1, Double7DstData
li a2, 16
jal ra, CheckAllWriteSignature
.type CheckAll, @function
# a0 is the SourceData, (golden), a1 is the data to be checked.
# a2 is the number of doubles
# a3 is the signature pointer
# returns a0 as 0 for no mismatch, 1 for mismatch,
# returns a3 as incremented signature pointer
CheckAllWriteSignature:
mv s0, a0
mv s1, a1
mv s2, a2
mv s3, a3
# there is no stack so I'm saving ra into s4
mv s4, ra
# Testcase 9: rs1:x8(0x983631890063e42f), rs2:x21(0xb2d650af313b32b7), result rd:x15(0x0000000000000001)
li x8, MASK_XLEN(0x983631890063e42f)
li x21, MASK_XLEN(0xb2d650af313b32b7)
SLT x15, x8, x21
sd x15, 72(x6)
# check values byte by byte
mv a0, s0 # SourceData
mv a1, s1 # ie: ByteDstData
srli a2, s2, 3 # * 8
jal ra, memcmp1
sb a0, 0(s3)
mv s4, a0
# Testcase 10: rs1:x19(0xb5d97ef760ef1471), rs2:x28(0xac7c8803e01bbf50), result rd:x14(0x0000000000000000)
li x19, MASK_XLEN(0xb5d97ef760ef1471)
li x28, MASK_XLEN(0xac7c8803e01bbf50)
SLT x14, x19, x28
sd x14, 80(x6)
# check values half by half
mv a0, s0 # SourceData
mv a1, s1 # ie: ByteDstData
srli a2, s2, 2 # * 4
jal ra, memcmp2
sb a0, 1(s3)
or s4, s4, a0
# Testcase 11: rs1:x19(0x66faf98908135d58), rs2:x14(0xb3ab1b2cdf26f517), result rd:x25(0x0000000000000000)
li x19, MASK_XLEN(0x66faf98908135d58)
li x14, MASK_XLEN(0xb3ab1b2cdf26f517)
SLT x25, x19, x14
sd x25, 88(x6)
# check values half by half
mv a0, s0 # SourceData
addi a1, s1, 1 # ie: ByteDstData+1
srli a2, s2, 2 # * 4 -1
subi a2, a2, 1
jal ra, memcmp2
sb a0, 2(s3)
or s4, s4, a0
# check values word by word
mv a0, s0 # SourceData
mv a1, s1 # ie: ByteDstData
srli a2, s2, 1 # * 2
jal ra, memcmp4
sb a0, 3(s3)
or s4, s4, a0
.EQU NUMTESTS,12
# check values word by word
mv a0, s0 # SourceData
addi a1, s1, 1 # ie: ByteDstData+1
srli a2, s2, 1 # * 2 -1
subi a2, a2, 1
jal ra, memcmp4
sb a0, 4(s3)
or s4, s4, a0
# check values word by word
mv a0, s0 # SourceData
addi a1, s1, 2 # ie: ByteDstData+2
srli a2, s2, 1 # * 2 -1
subi a2, a2, 1
jal ra, memcmp4
sb a0, 5(s3)
or s4, s4, a0
# check values word by word
mv a0, s0 # SourceData
addi a1, s1, 3 # ie: ByteDstData+3
srli a2, s2, 1 # * 2 -1
subi a2, a2, 1
jal ra, memcmp4
sb a0, 6(s3)
or s4, s4, a0
# check values double by double
mv a0, s0 # SourceData
mv a1, s1 # ie: ByteDstData
srli a2, s2, 0 # * 1
jal ra, memcmp8
sb a0, 7(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 1 # ie: ByteDstData+1
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 8(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 2 # ie: ByteDstData+2
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 9(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 3 # ie: ByteDstData+3
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 10(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 4 # ie: ByteDstData+4
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 11(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 5 # ie: ByteDstData+5
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 12(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 6 # ie: ByteDstData+6
srli a2, s2, 0 # * 1 -1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 13(s3)
# check values double by double
mv a0, s0 # SourceData
addi a1, s1, 7 # ie: ByteDstData+7
srli a2, s2, 0 # * 1
subi a2, a2, 1
jal ra, memcmp8
sb a0, 14(s3)
addi s3, s3, 15
mv a3, s3
or a0, s4, a0
mv ra, s4
ret ra
.type memcmp1, @function
# returns which index mismatch, -1 if none
memcmp1:
# a0 is the source1
# a1 is the source2
# a2 is the number of 1 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcmp1_loop:
lbu t3, 0(t0)
lbu t4, 0(t1)
bne t3, t4, memcmp1_ne
addi t0, t0, 1
addi t1, t1, 1
addi t2, t2, 1
blt t2, a2, memcmp1_loop
li a0, -1
ret
memcmp1_ne:
mv a0, t2
ret
.type memcmp2, @function
# returns which index mismatch, -1 if none
memcmp2:
# a0 is the source1
# a1 is the source2
# a2 is the number of 2 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcmp2_loop:
lhu t3, 0(t0)
lhu t4, 0(t1)
bne t3, t4, memcmp2_ne
addi t0, t0, 2
addi t1, t1, 2
addi t2, t2, 1
blt t2, a2, memcmp2_loop
li a0, -1
ret
memcmp2_ne:
mv a0, t2
ret
.type memcmp4, @function
# returns which index mismatch, -1 if none
memcmp4:
# a0 is the source1
# a1 is the source2
# a2 is the number of 4 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcmp4_loop:
lwu t3, 0(t0)
lwu t4, 0(t1)
bne t3, t4, memcmp4_ne
addi t0, t0, 4
addi t1, t1, 4
addi t2, t2, 1
blt t2, a2, memcmp4_loop
li a0, -1
ret
memcmp4_ne:
mv a0, t2
ret
.type memcmp8, @function
# returns which index mismatch, -1 if none
memcmp8:
# a0 is the source1
# a1 is the source2
# a2 is the number of 8 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcmp8_loop:
ld t3, 0(t0)
ld t4, 0(t1)
bne t3, t4, memcmp8_ne
addi t0, t0, 8
addi t1, t1, 8
addi t2, t2, 1
blt t2, a2, memcmp8_loop
li a0, -1
ret
memcmp8_ne:
mv a0, t2
ret
RVTEST_CODE_END
RVMODEL_HALT
.type memcpy8_1, @function
# load 8 bytes using load double then store using 8 sb
memcpy8_1:
# a0 is the source
# a1 is the dst
# a2 is the number of 8 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcpy8_1_loop:
ld t3, 0(t0)
andi t4, t3, 0xff
sb t4, 0(t1)
slli t4, t3, 8
andi t4, t4, 0xff
sb t4, 1(t1)
slli t4, t3, 16
andi t4, t4, 0xff
sb t4, 2(t1)
slli t4, t3, 24
andi t4, t4, 0xff
sb t4, 3(t1)
slli t4, t3, 32
andi t4, t4, 0xff
sb t4, 4(t1)
slli t4, t3, 40
andi t4, t4, 0xff
sb t4, 5(t1)
slli t4, t3, 48
andi t4, t4, 0xff
sb t4, 6(t1)
slli t4, t3, 56
andi t4, t4, 0xff
sb t4, 7(t1)
addi t0, t0, 8
addi t1, t1, 8
addi t2, t2, 1
blt t2, a2, memcpy8_1_loop
ret
.type memcpy8_2, @function
# load 8 bytes using load double then store using 4 sh
memcpy8_2:
# a0 is the source
# a1 is the dst
# a2 is the number of 8 byte words
mv t0, a0
mv t1, a1
li t2, 0
# 16 bit mask
lui t4, 0xf
ori t4, t4, 0xfff
memcpy8_2_loop:
ld t3, 0(t0)
and t4, t4, t3
sh t4, 0(t1)
slli t4, t3, 16
and t4, t4, t3
sh t4, 2(t1)
slli t4, t3, 32
and t4, t4, t3
sh t4, 4(t1)
slli t4, t3, 48
and t4, t4, t3
sh t4, 6(t1)
addi t0, t0, 8
addi t1, t1, 8
addi t2, t2, 1
blt t2, a2, memcpy8_2_loop
ret
.type memcpy8_4, @function
# load 8 bytes using load double then store using 2 sw
memcpy8_4:
# a0 is the source
# a1 is the dst
# a2 is the number of 8 byte words
mv t0, a0
mv t1, a1
li t2, 0
# 32 bit mask
lui t4, 0xffff
ori t4, t4, 0xfff
memcpy8_4_loop:
ld t3, 0(t0)
and t4, t4, t3
sw t4, 0(t1)
slli t4, t3, 32
and t4, t4, t3
sw t4, 4(t1)
addi t0, t0, 8
addi t1, t1, 8
addi t2, t2, 1
blt t2, a2, memcpy8_4_loop
ret
.type memcpy8_8, @function
# load 8 bytes using load double then store using 1 sd
memcpy8_8:
# a0 is the source
# a1 is the dst
# a2 is the number of 8 byte words
mv t0, a0
mv t1, a1
li t2, 0
memcpy8_8_loop:
ld t3, 0(t0)
sd t4, 0(t1)
addi t0, t0, 8
addi t1, t1, 8
addi t2, t2, 1
blt t2, a2, memcpy8_8_loop
ret
RVTEST_DATA_BEGIN
.align 4
.align 3
rvtest_data:
.word 0x98765432
SourceData:
.8byte 0x0706050403020100, 0x0f0e0d0c0b0a0908, 0x1716151413021110, 0x1f1e1d1c1b1a1918
.8byte 0x2726252423222120, 0x2f2e2d2c2b2a2928, 0x3736353433023130, 0x3f3e3d3c3b3a3938
.8byte 0x4746454443424140, 0x4f4e4d4c4b4a4948, 0x5756555453025150, 0x5f5e5d5c5b5a5958
.8byte 0x6766656463626160, 0x6f6e6d6c6b6a6968, 0x7776757473027170, 0x7f7e7d7c7b7a7978
.8byte 0xdeadbeefdeadbeef
Response1ByteOffsetData:
.8byte 0x0807060504030201, 0x100f0e0d0c0b0a09, 0x1817161514130211, 0x201f1e1d1c1b1a19
.8byte 0x2827262524232221, 0x302f2e2d2c2b2a29, 0x3837363534330231, 0x403f3e3d3c3b3a39
.8byte 0x4847464544434241, 0x504f4e4d4c4b4a49, 0x5857565554530251, 0x605f5e5d5c5b5a59
.8byte 0x6867666564636261, 0x706f6e6d6c6b6a69, 0x7877767574730271, 0xde7f7e7d7c7b7a79
Response2ByteOffsetData:
.8byte 0x0908070605040302, 0x11100f0e0d0c0b0a, 0x1918171615141302, 0x21201f1e1d1c1b1a
.8byte 0x2928272625242322, 0x31302f2e2d2c2b2a, 0x3938373635343302, 0x41403f3e3d3c3b3a
.8byte 0x4948474645444342, 0x51504f4e4d4c4b4a, 0x5958575655545302, 0x61605f5e5d5c5b5a
.8byte 0x6968676665646362, 0x71706f6e6d6c6b6a, 0x7978777675747302, 0xdead7f7e7d7c7b7a
Response3ByteOffsetData:
.8byte 0x0a09080706050403, 0x0211100f0e0d0c0b, 0x1a19181716151413, 0x2221201f1e1d1c1b
.8byte 0x2a29282726252423, 0x0231302f2e2d2c2b, 0x3a39383736353433, 0x4241403f3e3d3c3b
.8byte 0x4a49484746454443, 0x0251504f4e4d4c4b, 0x5a59585756555453, 0x6261605f5e5d5c5b
.8byte 0x6a69686766656463, 0x0271706f6e6d6c6b, 0x7a79787776757473, 0xdeadbe7f7e7d7c7b
Response4ByteOffsetData:
.8byte 0x0b0a090807060504, 0x130211100f0e0d0c, 0x1b1a191817161514, 0x232221201f1e1d1c
.8byte 0x2b2a292827262524, 0x330231302f2e2d2c, 0x3b3a393837363534, 0x434241403f3e3d3c
.8byte 0x4b4a494847464544, 0x530251504f4e4d4c, 0x5b5a595857565554, 0x636261605f5e5d5c
.8byte 0x6b6a696867666564, 0x730271706f6e6d6c, 0x7b7a797877767574, 0xdeadbeef7f7e7d7c
Response5ByteOffsetData:
.8byte 0x0c0b0a0908070605, 0x14130211100f0e0d, 0x1c1b1a1918171615, 0x24232221201f1e1d
.8byte 0x2c2b2a2928272625, 0x34330231302f2e2d, 0x3c3b3a3938373635, 0x44434241403f3e3d
.8byte 0x4c4b4a4948474645, 0x54530251504f4e4d, 0x5c5b5a5958575655, 0x64636261605f5e5d
.8byte 0x6c6b6a6968676665, 0x74730271706f6e6d, 0x7c7b7a7978777675, 0xdeadbeefde7f7e7d
Response6ByteOffsetData:
.8byte 0x0d0c0b0a09080706, 0x1514130211100f0e, 0x1d1c1b1a19181716, 0x2524232221201f1e
.8byte 0x2d2c2b2a29282726, 0x3534330231302f2e, 0x3d3c3b3a39383736, 0x4544434241403f3e
.8byte 0x4d4c4b4a49484746, 0x5554530251504f4e, 0x5d5c5b5a59585756, 0x6564636261605f5e
.8byte 0x6d6c6b6a69686766, 0x7574730271706f6e, 0x7d7c7b7a79787776, 0xdeadbeefdead7f7e
Response7ByteOffsetData:
.8byte 0x0e0d0c0b0a090807, 0x161514130211100f, 0x1e1d1c1b1a191817, 0x262524232221201f
.8byte 0x2e2d2c2b2a292827, 0x363534330231302f, 0x3e3d3c3b3a393837, 0x464544434241403f
.8byte 0x4e4d4c4b4a494847, 0x565554530251504f, 0x5e5d5c5b5a595857, 0x666564636261605f
.8byte 0x6e6d6c6b6a696867, 0x767574730271706f, 0x7e7d7c7b7a797877, 0xdeadbeefdeadbe7f
RVTEST_DATA_END
RVMODEL_DATA_BEGIN
ByteDstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
wally_signature:
.fill NUMTESTS*(XLEN/32),4,0xdeadbeef
Half0DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Half1DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
#ifdef rvtest_mtrap_routine
Word0DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
mtrap_sigptr:
.fill 64*(XLEN/32),4,0xdeadbeef
Word1DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
#endif
Word2DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Word3DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double0DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
#ifdef rvtest_gpr_save
gpr_save:
.fill 32*(XLEN/32),4,0xdeadbeef
#endif
Double1DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double2DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double3DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double4DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double5DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double6DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
Double7DstData:
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
.8byte 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef
signature:
.fill 225, 1, 0xff
RVMODEL_DATA_END
// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-SLT.S
// David_Harris@hmc.edu & Katherine Parry