From c33d97d80ffe8c63de00ee3adf42883d7c26b2cf Mon Sep 17 00:00:00 2001 From: Olof Kindgren Date: Fri, 9 Nov 2018 21:28:27 +0100 Subject: [PATCH] Update firmware --- firmware.hex | 13406 +++++++++++----------- picorv32_firmware/Makefile | 179 + picorv32_firmware/firmware/firmware.bin | Bin 45184 -> 0 bytes picorv32_firmware/firmware/firmware.elf | Bin 73968 -> 62724 bytes picorv32_firmware/firmware/firmware.hex | 13406 +++++++++++----------- picorv32_firmware/firmware/firmware.map | 396 - picorv32_firmware/firmware/multest.c | 30 +- picorv32_firmware/firmware/multest.o | Bin 3812 -> 0 bytes picorv32_firmware/firmware/start.S | 48 +- picorv32_firmware/firmware/start.o | Bin 5308 -> 0 bytes picorv32_firmware/tests/LICENSE | 24 + picorv32_firmware/tests/README | 1 + picorv32_firmware/tests/add.S | 85 + picorv32_firmware/tests/add.o | Bin 0 -> 3972 bytes picorv32_firmware/tests/addi.S | 71 + picorv32_firmware/tests/addi.o | Bin 0 -> 2600 bytes picorv32_firmware/tests/and.S | 69 + picorv32_firmware/tests/and.o | Bin 0 -> 3536 bytes picorv32_firmware/tests/andi.S | 55 + picorv32_firmware/tests/andi.o | Bin 0 -> 2004 bytes picorv32_firmware/tests/auipc.S | 39 + picorv32_firmware/tests/auipc.o | Bin 0 -> 1268 bytes picorv32_firmware/tests/beq.S | 73 + picorv32_firmware/tests/beq.o | Bin 0 -> 3416 bytes picorv32_firmware/tests/bge.S | 76 + picorv32_firmware/tests/bge.o | Bin 0 -> 3968 bytes picorv32_firmware/tests/bgeu.S | 76 + picorv32_firmware/tests/bgeu.o | Bin 0 -> 4024 bytes picorv32_firmware/tests/blt.S | 73 + picorv32_firmware/tests/blt.o | Bin 0 -> 3416 bytes picorv32_firmware/tests/bltu.S | 73 + picorv32_firmware/tests/bltu.o | Bin 0 -> 3476 bytes picorv32_firmware/tests/bne.S | 73 + picorv32_firmware/tests/bne.o | Bin 0 -> 3456 bytes picorv32_firmware/tests/div.S.ignore | 41 + picorv32_firmware/tests/divu.S.ignore | 41 + picorv32_firmware/tests/j.S | 49 + picorv32_firmware/tests/j.o | Bin 0 -> 1056 bytes picorv32_firmware/tests/jal.S | 60 + picorv32_firmware/tests/jal.o | Bin 0 -> 1224 bytes picorv32_firmware/tests/jalr.S | 88 + picorv32_firmware/tests/jalr.o | Bin 0 -> 2128 bytes picorv32_firmware/tests/lb.S | 92 + picorv32_firmware/tests/lb.o | Bin 0 -> 3584 bytes picorv32_firmware/tests/lbu.S | 92 + picorv32_firmware/tests/lbu.o | Bin 0 -> 3588 bytes picorv32_firmware/tests/lh.S | 92 + picorv32_firmware/tests/lh.o | Bin 0 -> 3620 bytes picorv32_firmware/tests/lhu.S | 92 + picorv32_firmware/tests/lhu.o | Bin 0 -> 3644 bytes picorv32_firmware/tests/lui.S | 36 + picorv32_firmware/tests/lui.o | Bin 0 -> 1156 bytes picorv32_firmware/tests/lw.S | 92 + picorv32_firmware/tests/lw.o | Bin 0 -> 3660 bytes picorv32_firmware/tests/mul.S.ignore | 84 + picorv32_firmware/tests/mulh.S.ignore | 81 + picorv32_firmware/tests/mulhsu.S.ignore | 83 + picorv32_firmware/tests/mulhu.S.ignore | 82 + picorv32_firmware/tests/or.S | 69 + picorv32_firmware/tests/or.o | Bin 0 -> 3548 bytes picorv32_firmware/tests/ori.S | 55 + picorv32_firmware/tests/ori.o | Bin 0 -> 2024 bytes picorv32_firmware/tests/rem.S.ignore | 41 + picorv32_firmware/tests/remu.S.ignore | 41 + picorv32_firmware/tests/riscv_test.h | 64 + picorv32_firmware/tests/sb.S | 96 + picorv32_firmware/tests/sb.o | Bin 0 -> 4884 bytes picorv32_firmware/tests/sh.S | 96 + picorv32_firmware/tests/sh.o | Bin 0 -> 5024 bytes picorv32_firmware/tests/simple.S | 27 + picorv32_firmware/tests/simple.o | Bin 0 -> 792 bytes picorv32_firmware/tests/sll.S | 90 + picorv32_firmware/tests/sll.o | Bin 0 -> 4292 bytes picorv32_firmware/tests/slli.S | 68 + picorv32_firmware/tests/slli.o | Bin 0 -> 2596 bytes picorv32_firmware/tests/slt.S | 84 + picorv32_firmware/tests/slt.o | Bin 0 -> 3948 bytes picorv32_firmware/tests/slti.S | 70 + picorv32_firmware/tests/slti.o | Bin 0 -> 2580 bytes picorv32_firmware/tests/sra.S | 90 + picorv32_firmware/tests/sra.o | Bin 0 -> 4340 bytes picorv32_firmware/tests/srai.S | 68 + picorv32_firmware/tests/srai.o | Bin 0 -> 2648 bytes picorv32_firmware/tests/srl.S | 90 + picorv32_firmware/tests/srl.o | Bin 0 -> 4372 bytes picorv32_firmware/tests/srli.S | 69 + picorv32_firmware/tests/srli.o | Bin 0 -> 2644 bytes picorv32_firmware/tests/sub.S | 83 + picorv32_firmware/tests/sub.o | Bin 0 -> 3904 bytes picorv32_firmware/tests/sw.S | 92 + picorv32_firmware/tests/sw.o | Bin 0 -> 4992 bytes picorv32_firmware/tests/test_macros.h | 585 + picorv32_firmware/tests/xor.S | 69 + picorv32_firmware/tests/xor.o | Bin 0 -> 3544 bytes picorv32_firmware/tests/xori.S | 55 + picorv32_firmware/tests/xori.o | Bin 0 -> 2040 bytes 96 files changed, 17519 insertions(+), 13841 deletions(-) create mode 100644 picorv32_firmware/Makefile delete mode 100644 picorv32_firmware/firmware/firmware.bin delete mode 100644 picorv32_firmware/firmware/firmware.map delete mode 100644 picorv32_firmware/firmware/multest.o delete mode 100644 picorv32_firmware/firmware/start.o create mode 100644 picorv32_firmware/tests/LICENSE create mode 100644 picorv32_firmware/tests/README create mode 100644 picorv32_firmware/tests/add.S create mode 100644 picorv32_firmware/tests/add.o create mode 100644 picorv32_firmware/tests/addi.S create mode 100644 picorv32_firmware/tests/addi.o create mode 100644 picorv32_firmware/tests/and.S create mode 100644 picorv32_firmware/tests/and.o create mode 100644 picorv32_firmware/tests/andi.S create mode 100644 picorv32_firmware/tests/andi.o create mode 100644 picorv32_firmware/tests/auipc.S create mode 100644 picorv32_firmware/tests/auipc.o create mode 100644 picorv32_firmware/tests/beq.S create mode 100644 picorv32_firmware/tests/beq.o create mode 100644 picorv32_firmware/tests/bge.S create mode 100644 picorv32_firmware/tests/bge.o create mode 100644 picorv32_firmware/tests/bgeu.S create mode 100644 picorv32_firmware/tests/bgeu.o create mode 100644 picorv32_firmware/tests/blt.S create mode 100644 picorv32_firmware/tests/blt.o create mode 100644 picorv32_firmware/tests/bltu.S create mode 100644 picorv32_firmware/tests/bltu.o create mode 100644 picorv32_firmware/tests/bne.S create mode 100644 picorv32_firmware/tests/bne.o create mode 100644 picorv32_firmware/tests/div.S.ignore create mode 100644 picorv32_firmware/tests/divu.S.ignore create mode 100644 picorv32_firmware/tests/j.S create mode 100644 picorv32_firmware/tests/j.o create mode 100644 picorv32_firmware/tests/jal.S create mode 100644 picorv32_firmware/tests/jal.o create mode 100644 picorv32_firmware/tests/jalr.S create mode 100644 picorv32_firmware/tests/jalr.o create mode 100644 picorv32_firmware/tests/lb.S create mode 100644 picorv32_firmware/tests/lb.o create mode 100644 picorv32_firmware/tests/lbu.S create mode 100644 picorv32_firmware/tests/lbu.o create mode 100644 picorv32_firmware/tests/lh.S create mode 100644 picorv32_firmware/tests/lh.o create mode 100644 picorv32_firmware/tests/lhu.S create mode 100644 picorv32_firmware/tests/lhu.o create mode 100644 picorv32_firmware/tests/lui.S create mode 100644 picorv32_firmware/tests/lui.o create mode 100644 picorv32_firmware/tests/lw.S create mode 100644 picorv32_firmware/tests/lw.o create mode 100644 picorv32_firmware/tests/mul.S.ignore create mode 100644 picorv32_firmware/tests/mulh.S.ignore create mode 100644 picorv32_firmware/tests/mulhsu.S.ignore create mode 100644 picorv32_firmware/tests/mulhu.S.ignore create mode 100644 picorv32_firmware/tests/or.S create mode 100644 picorv32_firmware/tests/or.o create mode 100644 picorv32_firmware/tests/ori.S create mode 100644 picorv32_firmware/tests/ori.o create mode 100644 picorv32_firmware/tests/rem.S.ignore create mode 100644 picorv32_firmware/tests/remu.S.ignore create mode 100644 picorv32_firmware/tests/riscv_test.h create mode 100644 picorv32_firmware/tests/sb.S create mode 100644 picorv32_firmware/tests/sb.o create mode 100644 picorv32_firmware/tests/sh.S create mode 100644 picorv32_firmware/tests/sh.o create mode 100644 picorv32_firmware/tests/simple.S create mode 100644 picorv32_firmware/tests/simple.o create mode 100644 picorv32_firmware/tests/sll.S create mode 100644 picorv32_firmware/tests/sll.o create mode 100644 picorv32_firmware/tests/slli.S create mode 100644 picorv32_firmware/tests/slli.o create mode 100644 picorv32_firmware/tests/slt.S create mode 100644 picorv32_firmware/tests/slt.o create mode 100644 picorv32_firmware/tests/slti.S create mode 100644 picorv32_firmware/tests/slti.o create mode 100644 picorv32_firmware/tests/sra.S create mode 100644 picorv32_firmware/tests/sra.o create mode 100644 picorv32_firmware/tests/srai.S create mode 100644 picorv32_firmware/tests/srai.o create mode 100644 picorv32_firmware/tests/srl.S create mode 100644 picorv32_firmware/tests/srl.o create mode 100644 picorv32_firmware/tests/srli.S create mode 100644 picorv32_firmware/tests/srli.o create mode 100644 picorv32_firmware/tests/sub.S create mode 100644 picorv32_firmware/tests/sub.o create mode 100644 picorv32_firmware/tests/sw.S create mode 100644 picorv32_firmware/tests/sw.o create mode 100644 picorv32_firmware/tests/test_macros.h create mode 100644 picorv32_firmware/tests/xor.S create mode 100644 picorv32_firmware/tests/xor.o create mode 100644 picorv32_firmware/tests/xori.S create mode 100644 picorv32_firmware/tests/xori.o diff --git a/firmware.hex b/firmware.hex index c0e37f1..b2484b6 100644 --- a/firmware.hex +++ b/firmware.hex @@ -46,7 +46,7 @@ 00000537 16050513 0000c58b -638000ef +5b8000ef 00050093 0000a103 0201200b @@ -279,146 +279,121 @@ 00000f93 3e800093 0a00e00b -0080706f +7850506f 3e800093 0a00e00b -6790406f +0390406f 3e800093 0a00e00b -3f90806f +1100806f 3e800093 0a00e00b -5b40806f +10c0706f 3e800093 0a00e00b -7210406f +0e10406f 3e800093 0a00e00b -7a80306f +1a50306f 3e800093 0a00e00b -2f50406f +19c0806f 3e800093 0a00e00b -3dd0206f +0750806f 3e800093 0a00e00b -4cc0906f +4c80806f 3e800093 0a00e00b -07c0706f +2f00306f 3e800093 0a00e00b -05c0506f +21d0406f 3e800093 0a00e00b -7b90106f +6710106f 3e800093 0a00e00b -2780206f +1300206f 3e800093 0a00e00b -4100506f +5d10406f 3e800093 0a00e00b -49c0606f +1110506f 3e800093 0a00e00b -75c0606f +3d10506f 3e800093 0a00e00b -0a40806f +6fc0706f 3e800093 0a00e00b -2450606f +3650706f 3e800093 0a00e00b -5600406f +2640406f 3e800093 0a00e00b -39d0306f +5f00306f 3e800093 0a00e00b -4150506f +0880506f 3e800093 0a00e00b -5150006f +3cd0006f 3e800093 0a00e00b -6010706f +2950606f 3e800093 0a00e00b -3b90806f +0450606f 3e800093 0a00e00b -1810706f +5300606f 3e800093 0a00e00b -3940a06f +4cd0606f 3e800093 0a00e00b -3700306f +6e90206f 3e800093 0a00e00b -56c0806f +1180706f 3e800093 0a00e00b -1ad0106f +0650106f 3e800093 0a00e00b -3040706f +7090506f 3e800093 0a00e00b -6950506f +3080506f 3e800093 0a00e00b -4480106f +3000106f 3e800093 0a00e00b -4740206f +32c0206f 3e800093 0a00e00b -5850806f +3950306f 3e800093 0a00e00b -6e10006f +5990006f 3e800093 0a00e00b -5cd0206f +1450206f 3e800093 0a00e00b -0790906f -3e800093 -0a00e00b -5b90906f -3e800093 -0a00e00b -5f00506f -3e800093 -0a00e00b -5b90306f -3e800093 -0a00e00b -6ec0906f -3e800093 -0a00e00b -2e80406f -3e800093 -0a00e00b -12d0306f -3e800093 -0a00e00b -3a50706f -3e800093 -0a00e00b -03d0706f +0580706f 00010137 deadc1b7 eef18193 00018213 -614000ef -7cc000ef -321000ef +5f4000ef +23d000ef 10000537 04400593 04f00613 @@ -435,14 +410,7 @@ eef18193 d1558593 00b52023 00100073 -02b50533 -00008067 -02b51533 -00008067 -02b52533 -00008067 -02b53533 -00008067 +00000000 00000000 fb010113 04912223 @@ -478,14 +446,14 @@ ffd70793 ffda0793 00f037b3 04d78863 -0000b537 -dc450513 +00009537 +1d450513 354000ef 00092503 00800593 3e4000ef -0000b537 -e0050513 +00009537 +21050513 33c000ef 00300793 00800593 @@ -493,28 +461,28 @@ e0050513 00400593 00040513 3c0000ef -0000b537 -e4850513 +00009537 +25850513 318000ef 00100073 0109f793 00078a63 -0000b737 -f2c72783 +00009737 +33c72783 00178793 -f2f72623 +32f72e23 0209f793 00078a63 -0000b737 -f2872783 +00009737 +33872783 00178793 -f2f72423 +32f72c23 0019f793 00078a63 -0000b737 -f2472783 +00009737 +33472783 00178793 -f2f72223 +32f72a23 1c048463 00092783 0017f713 @@ -528,11 +496,11 @@ ffd78a13 002a5783 01079793 00f4e4b3 -0000b437 -e4840513 +00009437 +25840513 28c000ef -0000bab7 -e0ca8513 +00009ab7 +21ca8513 280000ef 0029f793 02078e63 @@ -542,24 +510,24 @@ e0ca8513 000097b7 00278793 1af49063 -0000b537 -e4c50513 +00009537 +25c50513 254000ef 00800593 000a0513 2e4000ef -e4840513 +25840513 240000ef 0049f993 04098663 -0000b537 -e8c50513 +00009537 +29c50513 22c000ef 00800593 000a0513 2bc000ef -0000b537 -e8450513 +00009537 +29450513 214000ef 0034f793 00300713 @@ -568,23 +536,23 @@ e8450513 00800593 00048513 294000ef -e4840513 +25840513 1f0000ef -0000bbb7 +00009bb7 00000a13 00900c93 01300d13 -0000bdb7 -dbcb8b93 +00009db7 +1ccb8b93 002a1993 -e4840793 +25840793 000a0493 013909b3 00000b13 01d00c13 00f12623 12049c63 -eacd8513 +2bcd8513 1b0000ef 0009a503 00800593 @@ -602,31 +570,31 @@ fcfb12e3 001a0a13 00800793 f8fa1ee3 -e0ca8513 +21ca8513 168000ef -0000b537 -eb450513 +00009537 +2c450513 15c000ef -0000b7b7 -f2c7a503 +000097b7 +33c7a503 16c000ef -e4840513 +25840513 148000ef -0000b537 -edc50513 +00009537 +2ec50513 13c000ef -0000b7b7 -f287a503 +000097b7 +3387a503 14c000ef -e4840513 +25840513 128000ef -0000b537 -f0450513 +00009537 +31450513 11c000ef -0000b7b7 -f247a503 +000097b7 +3347a503 12c000ef -e4840513 +25840513 108000ef 00100073 04c12083 @@ -645,14 +613,14 @@ e4840513 01c12d83 05010113 00008067 -0000b537 -e6850513 +00009537 +27850513 0b8000ef 00800593 000a0513 148000ef -0000b537 -e8450513 +00009537 +29450513 0a0000ef 0034f793 00300713 @@ -724,18 +692,18 @@ ff2418e3 00008067 00a00593 00048513 -2000a0ef +690080ef 00140413 fea40fa3 00a00593 00048513 -1a40a0ef +634080ef 00050493 fa5ff06f fff58593 -0000b737 +00009737 00259593 -f4470713 +35470713 100006b7 0005d463 00008067 @@ -754,8 +722,8 @@ ff010113 00050413 00058493 00a7c863 -0000b537 -f5850513 +00009537 +36850513 f05ff0ef 00040513 f19ff0ef @@ -764,26 +732,26 @@ ff640793 0af77263 00a00593 00040513 -1940a0ef +624080ef 00200793 06f50c63 00300793 06f50e63 00100793 08f51063 -0000b537 -f5c50513 +00009537 +36c50513 ec1ff0ef -0000b537 -f6c50513 +00009537 +37c50513 eb5ff0ef 00048513 ec9ff0ef -0000b537 -f7850513 +00009537 +38850513 ea1ff0ef -0000b737 -f9872783 +00009737 +3a872783 00c12083 00579513 00f50533 @@ -792,25 +760,25 @@ f9872783 00812403 00a78533 00954533 -f8a72c23 +3aa72423 00412483 01010113 00008067 -0000b537 -f6050513 +00009537 +37050513 f9dff06f -0000b537 -f6450513 +00009537 +37450513 f91ff06f -0000b537 -f6850513 +00009537 +37850513 f85ff06f fd010113 000017b7 02912223 50578793 00100513 -0000b4b7 +000094b7 00200593 02812423 03212023 @@ -820,13 +788,13 @@ fd010113 02112623 01312e23 01712623 -f8f4ac23 -0000b937 +3af4a423 +00009937 ed1ff0ef 80000a37 00000413 00200513 -f9c90913 +3ac90913 00100a93 03f00b13 01fa0a13 @@ -868,13 +836,13 @@ fb5ff06f 00140413 04000793 f6f416e3 -0000b537 -f7c50513 +00009537 +38c50513 d3dff0ef -f984a503 +3a84a503 00800593 dcdff0ef -f984a703 +3a84a703 1772a7b7 48f78793 02f71c63 @@ -887,12 +855,12 @@ f984a703 01412a83 01012b03 00c12b83 -0000b537 -f8850513 +00009537 +39850513 03010113 cedff06f -0000b537 -f9050513 +00009537 +3a050513 ce1ff0ef 00100073 02c12083 @@ -906,176 +874,126 @@ ce1ff0ef 00c12b83 03010113 00008067 -0000b737 -fd072503 +00009737 +3d872503 00d51793 00a7c7b3 0117d513 00f547b3 00579513 00f54533 -fca72823 +3ca72c23 00008067 -fa010113 -05212823 -05312623 -05512223 -05612023 -03712e23 -03812c23 -03912a23 -03a12823 -04112e23 -04812c23 -04912a23 -05412423 -03b12623 +fc010113 +03212823 +03312623 +03612023 +01712e23 +01812c23 +01912a23 +01a12823 +01b12623 +02112e23 +02812c23 +02912a23 +03412423 +03512223 00a00993 -0000bbb7 -0000bab7 -0000bc37 -0000bcb7 -0000b937 -0000bd37 -0000bb37 +00009db7 +00009b37 +00009d37 +00009cb7 +00009c37 +00009937 +00009bb7 f81ff0ef 00050413 f79ff0ef 00050493 -41f55d93 -fa4b8513 +41f55a93 +3b4d8513 c15ff0ef 41f45a13 00800593 000a0513 ca1ff0ef -faca8513 +3bcb0513 bfdff0ef 00800593 00040513 c8dff0ef -fb0c0513 +3c0d0513 be9ff0ef 00800593 -000d8513 +000a8513 c79ff0ef -faca8513 +3bcb0513 bd5ff0ef 00800593 00048513 c65ff0ef 00a00513 bb5ff0ef -fb4c8513 +3c4c8513 bb9ff0ef +3ccc0513 +bb1ff0ef 00048593 00040513 -fa4ff0ef +1b4080ef 00800593 -00a12e23 -c3dff0ef -fbc90513 -b99ff0ef -00048593 -00040513 -f8cff0ef -00800593 -00a12c23 -c1dff0ef -fbc90513 -b79ff0ef -00048593 -00040513 -f74ff0ef -00800593 -00a12a23 -bfdff0ef -fbc90513 -b59ff0ef -00048593 -00040513 -f5cff0ef -00800593 -00a12823 -bddff0ef -00a00513 -b2dff0ef -fc0d0513 -b31ff0ef -00048593 -00040513 -4a5090ef -00800593 -00a12623 -bb5ff0ef -fbc90513 -b11ff0ef -000d8693 +c39ff0ef +3d490513 +b95ff0ef 00048613 +000a8693 00040513 000a0593 -4a1090ef -00058d93 -000d8513 +1b4080ef +00058513 00800593 -b89ff0ef -fbc90513 -ae5ff0ef +c11ff0ef +3d490513 +b6dff0ef 00048613 00000693 00040513 000a0593 -475090ef -00058a13 -000a0513 +18c080ef +00058513 00800593 -b5dff0ef -fbc90513 -ab9ff0ef +be9ff0ef +3d490513 +b45ff0ef 00048613 00000693 00040513 00000593 -449090ef -00058413 -00040513 +164080ef +00058513 00800593 -b31ff0ef -fbc90513 -a8dff0ef -00c12883 -01c12303 -01131e63 -01812803 -01b81a63 -01412703 -01471663 -01012783 -04878863 -0000b537 -fc850513 -a5dff0ef -00100073 -05c12083 -05812403 -05412483 -05012903 -04c12983 -04812a03 -04412a83 -04012b03 -03c12b83 -03812c03 -03412c83 -03012d03 -02c12d83 -06010113 -00008067 -f88b0513 +bc1ff0ef +3d490513 +b1dff0ef +398b8513 fff98993 -a11ff0ef -de0990e3 -fb5ff06f +b11ff0ef +ee0990e3 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +01812c03 +01412c83 +01012d03 +00c12d83 +04010113 +00008067 fc010113 03312623 02112e23 @@ -1110,12 +1028,12 @@ fc010113 00008067 00a00593 00098513 -3f9090ef +150080ef 03050513 00a48023 00098513 00a00593 -39d090ef +0f4080ef 00050993 00148493 f99ff06f @@ -1128,7 +1046,7 @@ ffe44783 ff240fa3 fff40413 00044503 -929ff0ef +9f1ff0ef f85ff06f ff010113 00112623 @@ -1136,51 +1054,51 @@ ff010113 00912223 c00024f3 c0202473 -0000b537 -fd450513 -90dff0ef +00009537 +3dc50513 +9d5ff0ef 00000613 00800593 00048513 ef9ff0ef -0000b537 -fec50513 -8f1ff0ef +00009537 +3f450513 +9b9ff0ef 00000613 00800593 00040513 eddff0ef -0000b537 -00450513 -8d5ff0ef +00009537 +40c50513 +99dff0ef 00040593 00048513 -2fd090ef +054080ef 00000613 00000593 eb9ff0ef -0000b537 -00c50513 -8b1ff0ef +00009537 +41450513 +979ff0ef 06400593 00048513 -225090ef +77d070ef 00040593 -2d1090ef +028080ef 06400593 -311090ef +068080ef 00100613 00200593 e85ff0ef 00812403 00c12083 00412483 -0000b537 -e4850513 +00009537 +25850513 01010113 -86dff06f +935ff06f 00001537 -29450513 +14c50513 10000637 00050583 00058c63 @@ -1332,9 +1250,9 @@ f00ffeb7 00b52023 00c52023 00d52023 -88cff06f +9d4ff06f 00001537 -4fc50513 +3b450513 10000637 00050583 00058a63 @@ -1669,9 +1587,9 @@ f00e8e93 00b52023 00c52023 00d52023 -be5fe06f +d2dfe06f 00002537 -a4050513 +8f850513 10000637 00050583 00058a63 @@ -2005,9 +1923,9 @@ f00e8e93 00b52023 00c52023 00d52023 -e80fe06f +fc8fe06f 00002537 -f8050513 +e3850513 10000637 00050583 00058a63 @@ -2341,9 +2259,9 @@ ff100093 00b52023 00c52023 00d52023 -91cfe06f +a64fe06f 00002537 -4c050513 +37850513 10000637 00050583 00058a63 @@ -2354,63 +2272,63 @@ ff1ff06f 02e00593 00b62023 00b62023 -00009097 -b4008093 +00007097 +09008093 00008183 fff00e93 00200e13 23d19c63 -00009097 -b2808093 +00007097 +07808093 00108183 00000e93 00300e13 23d19063 -00009097 -b1008093 +00007097 +06008093 00208183 ff000e93 00400e13 21d19463 -00009097 -af808093 +00007097 +04808093 00308183 00f00e93 00500e13 1fd19863 -00009097 -ae308093 +00007097 +03308093 ffd08183 fff00e93 00600e13 1dd19c63 -00009097 -acb08093 +00007097 +01b08093 ffe08183 00000e93 00700e13 1dd19063 -00009097 -ab308093 +00007097 +00308093 fff08183 ff000e93 00800e13 1bd19463 -00009097 -a9b08093 +00007097 +feb08093 00008183 00f00e93 00900e13 19d19863 -00009097 -a8008093 +00007097 +fd008093 fe008093 02008183 fff00e93 00a00e13 17d19a63 -00009097 -a6408093 +00007097 +fb408093 ffa08093 00708183 00000e93 @@ -2418,8 +2336,8 @@ ffa08093 15d19c63 00c00e13 00000213 -00009097 -a4108093 +00007097 +f9108093 00108183 00018313 ff000e93 @@ -2429,8 +2347,8 @@ ff000e93 fe5210e3 00d00e13 00000213 -00009097 -a1608093 +00007097 +f6608093 00108183 00000013 00018313 @@ -2441,8 +2359,8 @@ a1608093 fc521ee3 00e00e13 00000213 -00009097 -9e408093 +00007097 +f3408093 00108183 00000013 00000013 @@ -2454,8 +2372,8 @@ fc521ee3 fc521ce3 00f00e13 00000213 -00009097 -9b108093 +00007097 +f0108093 00108183 ff000e93 0bd19663 @@ -2464,8 +2382,8 @@ ff000e93 fe5212e3 01000e13 00000213 -00009097 -98a08093 +00007097 +eda08093 00000013 00108183 00f00e93 @@ -2475,8 +2393,8 @@ fe5212e3 fe5210e3 01100e13 00000213 -00009097 -95c08093 +00007097 +eac08093 00000013 00000013 00108183 @@ -2485,15 +2403,15 @@ fe5210e3 00120213 00200293 fc521ee3 -00009197 -93418193 +00007197 +e8418193 00018103 00200113 00200e93 01200e13 03d11463 -00009197 -91818193 +00007197 +e6818193 00018103 00000013 00200113 @@ -2520,9 +2438,9 @@ fc521ee3 00b52023 00c52023 00d52023 -d85fd06f +ecdfd06f 00002537 -78c50513 +64450513 10000637 00050583 00058a63 @@ -2533,67 +2451,67 @@ ff1ff06f 02e00593 00b62023 00b62023 -00009097 -87808093 +00007097 +dc808093 00009183 0ff00e93 00200e13 25d19c63 -00009097 -86008093 +00007097 +db008093 00209183 f0000e93 00300e13 25d19063 -00009097 -84808093 +00007097 +d9808093 00409183 00001eb7 ff0e8e93 00400e13 23d19263 -00009097 -82c08093 +00007097 +d7c08093 00609183 fffffeb7 00fe8e93 00500e13 21d19463 -00009097 -81608093 +00007097 +d6608093 ffa09183 0ff00e93 00600e13 1fd19863 -00008097 -7fe08093 +00007097 +d4e08093 ffc09183 f0000e93 00700e13 1dd19c63 -00008097 -7e608093 +00007097 +d3608093 ffe09183 00001eb7 ff0e8e93 00800e13 1bd19e63 -00008097 -7ca08093 +00007097 +d1a08093 00009183 fffffeb7 00fe8e93 00900e13 1bd19063 -00008097 -7a808093 +00007097 +cf808093 fe008093 02009183 0ff00e93 00a00e13 19d19263 -00008097 -78c08093 +00007097 +cdc08093 ffb08093 00709183 f0000e93 @@ -2601,8 +2519,8 @@ f0000e93 17d19463 00c00e13 00000213 -00008097 -76a08093 +00007097 +cba08093 00209183 00018313 00001eb7 @@ -2613,8 +2531,8 @@ ff0e8e93 fc521ee3 00d00e13 00000213 -00008097 -73c08093 +00007097 +c8c08093 00209183 00000013 00018313 @@ -2626,8 +2544,8 @@ fffffeb7 fc521ce3 00e00e13 00000213 -00008097 -70408093 +00007097 +c5408093 00209183 00000013 00000013 @@ -2639,8 +2557,8 @@ f0000e93 fc521ce3 00f00e13 00000213 -00008097 -6d208093 +00007097 +c2208093 00209183 00001eb7 ff0e8e93 @@ -2650,8 +2568,8 @@ ff0e8e93 fe5210e3 01000e13 00000213 -00008097 -6a808093 +00007097 +bf808093 00000013 00209183 fffffeb7 @@ -2662,8 +2580,8 @@ fffffeb7 fc521ee3 01100e13 00000213 -00008097 -67408093 +00007097 +bc408093 00000013 00000013 00209183 @@ -2672,15 +2590,15 @@ f0000e93 00120213 00200293 fc521ee3 -00008197 -64c18193 +00007197 +b9c18193 00019103 00200113 00200e93 01200e13 03d11463 -00008197 -63018193 +00007197 +b8018193 00019103 00000013 00200113 @@ -2707,9 +2625,9 @@ fc521ee3 00b52023 00c52023 00d52023 -aa5fd06f +bedfd06f 00003537 -a7850513 +93050513 10000637 00050583 00058a63 @@ -3106,217 +3024,9 @@ fffe8e93 00b52023 00c52023 00d52023 -d58fd06f +ea0fd06f 00003537 -0b450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00746c62 -02e00593 -00b62023 -00b62023 -00200e13 -00000093 -00100113 -0020c663 -2bc01863 -01c01663 -fe20cee3 -2bc01263 -00300e13 -fff00093 -00100113 -0020c663 -29c01863 -01c01663 -fe20cee3 -29c01263 -00400e13 -ffe00093 -fff00113 -0020c663 -27c01863 -01c01663 -fe20cee3 -27c01263 -00500e13 -00100093 -00000113 -0020c463 -01c01463 -25c01663 -fe20cee3 -00600e13 -00100093 -fff00113 -0020c463 -01c01463 -23c01863 -fe20cee3 -00700e13 -fff00093 -ffe00113 -0020c463 -01c01463 -21c01a63 -fe20cee3 -00800e13 -00100093 -ffe00113 -0020c463 -01c01463 -1fc01c63 -fe20cee3 -00900e13 -00000213 -00000093 -fff00113 -1e20c063 -00120213 -00200293 -fe5216e3 -00a00e13 -00000213 -00000093 -fff00113 -00000013 -1a20ce63 -00120213 -00200293 -fe5214e3 -00b00e13 -00000213 -00000093 -fff00113 -00000013 -00000013 -1820ca63 -00120213 -00200293 -fe5212e3 -00c00e13 -00000213 -00000093 -00000013 -fff00113 -1620c863 -00120213 -00200293 -fe5214e3 -00d00e13 -00000213 -00000093 -00000013 -fff00113 -00000013 -1420c463 -00120213 -00200293 -fe5212e3 -00e00e13 -00000213 -00000093 -00000013 -00000013 -fff00113 -1220c063 -00120213 -00200293 -fe5212e3 -00f00e13 -00000213 -00000093 -fff00113 -1020c063 -00120213 -00200293 -fe5216e3 -01000e13 -00000213 -00000093 -fff00113 -00000013 -0c20ce63 -00120213 -00200293 -fe5214e3 -01100e13 -00000213 -00000093 -fff00113 -00000013 -00000013 -0a20ca63 -00120213 -00200293 -fe5212e3 -01200e13 -00000213 -00000093 -00000013 -fff00113 -0820c863 -00120213 -00200293 -fe5214e3 -01300e13 -00000213 -00000093 -00000013 -fff00113 -00000013 -0620c463 -00120213 -00200293 -fe5212e3 -01400e13 -00000213 -00000093 -00000013 -00000013 -fff00113 -0420c063 -00120213 -00200293 -fe5212e3 -00100093 -00104a63 -00108093 -00108093 -00108093 -00108093 -00108093 -00108093 -00300e93 -01500e13 -01d09463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8ecfd06f -00003537 -3f450513 +f6c50513 10000637 00050583 00058a63 @@ -3648,9 +3358,9 @@ f0008093 00b52023 00c52023 00d52023 -d05fc06f -00004537 -92c50513 +98cfd06f +00003537 +4a450513 10000637 00050583 00058c63 @@ -3855,3658 +3565,9 @@ fff00e93 00b52023 00c52023 00d52023 -95dfc06f -00004537 -c6850513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00716562 -02e00593 -00b62023 -00b62023 -00200e13 -00000093 -00000113 -00208663 -2bc01863 -01c01663 -fe208ee3 -2bc01263 -00300e13 -00100093 -00100113 -00208663 -29c01863 -01c01663 -fe208ee3 -29c01263 -00400e13 -fff00093 -fff00113 -00208663 -27c01863 -01c01663 -fe208ee3 -27c01263 -00500e13 -00000093 -00100113 -00208463 -01c01463 -25c01663 -fe208ee3 -00600e13 -00100093 -00000113 -00208463 -01c01463 -23c01863 -fe208ee3 -00700e13 -fff00093 -00100113 -00208463 -01c01463 -21c01a63 -fe208ee3 -00800e13 -00100093 -fff00113 -00208463 -01c01463 -1fc01c63 -fe208ee3 -00900e13 -00000213 -00000093 -fff00113 -1e208063 -00120213 -00200293 -fe5216e3 -00a00e13 -00000213 -00000093 -fff00113 -00000013 -1a208e63 -00120213 -00200293 -fe5214e3 -00b00e13 -00000213 -00000093 -fff00113 -00000013 -00000013 -18208a63 -00120213 -00200293 -fe5212e3 -00c00e13 -00000213 -00000093 -00000013 -fff00113 -16208863 -00120213 -00200293 -fe5214e3 -00d00e13 -00000213 -00000093 -00000013 -fff00113 -00000013 -14208463 -00120213 -00200293 -fe5212e3 -00e00e13 -00000213 -00000093 -00000013 -00000013 -fff00113 -12208063 -00120213 -00200293 -fe5212e3 -00f00e13 -00000213 -00000093 -fff00113 -10208063 -00120213 -00200293 -fe5216e3 -01000e13 -00000213 -00000093 -fff00113 -00000013 -0c208e63 -00120213 -00200293 -fe5214e3 -01100e13 -00000213 -00000093 -fff00113 -00000013 -00000013 -0a208a63 -00120213 -00200293 -fe5212e3 -01200e13 -00000213 -00000093 -00000013 -fff00113 -08208863 -00120213 -00200293 -fe5214e3 -01300e13 -00000213 -00000093 -00000013 -fff00113 -00000013 -06208463 -00120213 -00200293 -fe5212e3 -01400e13 -00000213 -00000093 -00000013 -00000013 -fff00113 -04208063 -00120213 -00200293 -fe5212e3 -00100093 -00000a63 -00108093 -00108093 -00108093 -00108093 -00108093 -00108093 -00300e93 -01500e13 -01d09463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -d20fc06f -00004537 -fa850513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -006d6572 -02e00593 -00b62023 -00b62023 -01400093 -00600113 -0220e1b3 -00200e93 -00200e13 -0dd19463 -fec00093 -00600113 -0220e1b3 -ffe00e93 -00300e13 -0bd19863 -01400093 -ffa00113 -0220e1b3 -00200e93 -00400e13 -09d19c63 -fec00093 -ffa00113 -0220e1b3 -ffe00e93 -00500e13 -09d19063 -800000b7 -00100113 -0220e1b3 -00000e93 -00600e13 -07d19463 -800000b7 -fff00113 -0220e1b3 -00000e93 -00700e13 -05d19863 -800000b7 -00000113 -0220e1b3 -80000eb7 -00800e13 -03d19c63 -00100093 -00000113 -0220e1b3 -00100e93 -00900e13 -03d19063 -00000093 -00000113 -0220e1b3 -00000e93 -00a00e13 -01d19463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -d80fc06f -00004537 -10450513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -69646461 -00000000 -02e00593 -00b62023 -00b62023 -00000093 -00008193 -00000e93 -00200e13 -27d19c63 -00100093 -00108193 -00200e93 -00300e13 -27d19263 -00300093 -00708193 -00a00e93 -00400e13 -25d19863 -00000093 -80008193 -80000e93 -00500e13 -23d19e63 -800000b7 -00008193 -80000eb7 -00600e13 -23d19463 -800000b7 -80008193 -80000eb7 -800e8e93 -00700e13 -21d19863 -00000093 -7ff08193 -7ff00e93 -00800e13 -1fd19e63 -800000b7 -fff08093 -00008193 -80000eb7 -fffe8e93 -00900e13 -1fd19063 -800000b7 -fff08093 -7ff08193 -80000eb7 -7fee8e93 -00a00e13 -1dd19263 -800000b7 -7ff08193 -80000eb7 -7ffe8e93 -00b00e13 -1bd19663 -800000b7 -fff08093 -80008193 -7ffffeb7 -7ffe8e93 -00c00e13 -19d19863 -00000093 -fff08193 -fff00e93 -00d00e13 -17d19e63 -fff00093 -00108193 -00000e93 -00e00e13 -17d19463 -fff00093 -fff08193 -ffe00e93 -00f00e13 -15d19a63 -800000b7 -fff08093 -00108193 -80000eb7 -01000e13 -13d19e63 -00d00093 -00b08093 -01800e93 -01100e13 -13d09463 -00000213 -00d00093 -00b08193 -00018313 -00120213 -00200293 -fe5216e3 -01800e93 -01200e13 -11d31063 -00000213 -00d00093 -00a08193 -00000013 -00018313 -00120213 -00200293 -fe5214e3 -01700e93 -01300e13 -0dd31a63 -00000213 -00d00093 -00908193 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -01600e93 -01400e13 -0bd31263 -00000213 -00d00093 -00b08193 -00120213 -00200293 -fe5218e3 -01800e93 -01500e13 -09d19063 -00000213 -00d00093 -00000013 -00a08193 -00120213 -00200293 -fe5216e3 -01700e93 -01600e13 -05d19c63 -00000213 -00d00093 -00000013 -00000013 -00908193 -00120213 -00200293 -fe5214e3 -01600e93 -01700e13 -03d19663 -02000093 -02000e93 -01800e13 -01d09e63 -02100093 -03208013 -00000e93 -01900e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -960fc06f -00004537 -41050513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -006c756d -02e00593 -00b62023 -00b62023 -000080b7 -e0008093 -b6db7137 -db710113 -022081b3 -00001eb7 -200e8e93 -02000e13 -4bd19463 -000080b7 -fc008093 -b6db7137 -db710113 -022081b3 -00001eb7 -240e8e93 -02100e13 -49d19263 -00000093 -00000113 -022081b3 -00000e93 -00200e13 -47d19663 -00100093 -00100113 -022081b3 -00100e93 -00300e13 -45d19a63 -00300093 -00700113 -022081b3 -01500e93 -00400e13 -43d19e63 -00000093 -ffff8137 -022081b3 -00000e93 -00500e13 -43d19263 -800000b7 -00000113 -022081b3 -00000e93 -00600e13 -41d19663 -800000b7 -ffff8137 -022081b3 -00000e93 -00700e13 -3fd19a63 -aaaab0b7 -aab08093 -00030137 -e7d10113 -022081b3 -00010eb7 -f7fe8e93 -01e00e13 -3dd19863 -000300b7 -e7d08093 -aaaab137 -aab10113 -022081b3 -00010eb7 -f7fe8e93 -01f00e13 -3bd19663 -ff0000b7 -ff000137 -022081b3 -00000e93 -02200e13 -39d19a63 -fff00093 -fff00113 -022081b3 -00100e93 -02300e13 -37d19e63 -fff00093 -00100113 -022081b3 -fff00e93 -02400e13 -37d19263 -00100093 -fff00113 -022081b3 -fff00e93 -02500e13 -35d19663 -00d00093 -00b00113 -022080b3 -08f00e93 -00800e13 -33d09a63 -00e00093 -00b00113 -02208133 -09a00e93 -00900e13 -31d11e63 -00d00093 -021080b3 -0a900e93 -00a00e13 -31d09463 -00000213 -00d00093 -00b00113 -022081b3 -00018313 -00120213 -00200293 -fe5214e3 -08f00e93 -00b00e13 -2dd31e63 -00000213 -00e00093 -00b00113 -022081b3 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -09a00e93 -00c00e13 -2bd31663 -00000213 -00f00093 -00b00113 -022081b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -0a500e93 -00d00e13 -27d31c63 -00000213 -00d00093 -00b00113 -022081b3 -00120213 -00200293 -fe5216e3 -08f00e93 -00e00e13 -25d19863 -00000213 -00e00093 -00b00113 -00000013 -022081b3 -00120213 -00200293 -fe5214e3 -09a00e93 -00f00e13 -23d19263 -00000213 -00f00093 -00b00113 -00000013 -00000013 -022081b3 -00120213 -00200293 -fe5212e3 -0a500e93 -01000e13 -1fd19a63 -00000213 -00d00093 -00000013 -00b00113 -022081b3 -00120213 -00200293 -fe5214e3 -08f00e93 -01100e13 -1dd19463 -00000213 -00e00093 -00000013 -00b00113 -00000013 -022081b3 -00120213 -00200293 -fe5212e3 -09a00e93 -01200e13 -19d19c63 -00000213 -00f00093 -00000013 -00000013 -00b00113 -022081b3 -00120213 -00200293 -fe5212e3 -0a500e93 -01300e13 -17d19463 -00000213 -00b00113 -00d00093 -022081b3 -00120213 -00200293 -fe5216e3 -08f00e93 -01400e13 -15d19063 -00000213 -00b00113 -00e00093 -00000013 -022081b3 -00120213 -00200293 -fe5214e3 -09a00e93 -01500e13 -11d19a63 -00000213 -00b00113 -00f00093 -00000013 -00000013 -022081b3 -00120213 -00200293 -fe5212e3 -0a500e93 -01600e13 -0fd19263 -00000213 -00b00113 -00000013 -00d00093 -022081b3 -00120213 -00200293 -fe5214e3 -08f00e93 -01700e13 -0bd19c63 -00000213 -00b00113 -00000013 -00e00093 -00000013 -022081b3 -00120213 -00200293 -fe5212e3 -09a00e93 -01800e13 -09d19463 -00000213 -00b00113 -00000013 -00000013 -00f00093 -022081b3 -00120213 -00200293 -fe5212e3 -0a500e93 -01900e13 -05d19c63 -01f00093 -02100133 -00000e93 -01a00e13 -05d11263 -02000093 -02008133 -00000e93 -01b00e13 -03d11863 -020000b3 -00000e93 -01c00e13 -03d09063 -02100093 -02200113 -02208033 -00000e93 -01d00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -d09fb06f -00005537 -95850513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -75766964 -00000000 -02e00593 -00b62023 -00b62023 -01400093 -00600113 -0220d1b3 -00300e93 -00200e13 -0dd19663 -fec00093 -00600113 -0220d1b3 -2aaabeb7 -aa7e8e93 -00300e13 -0bd19863 -01400093 -ffa00113 -0220d1b3 -00000e93 -00400e13 -09d19c63 -fec00093 -ffa00113 -0220d1b3 -00000e93 -00500e13 -09d19063 -800000b7 -00100113 -0220d1b3 -80000eb7 -00600e13 -07d19463 -800000b7 -fff00113 -0220d1b3 -00000e93 -00700e13 -05d19863 -800000b7 -00000113 -0220d1b3 -fff00e93 -00800e13 -03d19c63 -00100093 -00000113 -0220d1b3 -fff00e93 -00900e13 -03d19063 -00000093 -00000113 -0220d1b3 -fff00e93 -00a00e13 -01d19463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -bbdfb06f -00005537 -abc50513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00007773 -02e00593 -00b62023 -00b62023 -00006097 -55008093 -00aa0137 -0aa10113 -0020a023 -0000a183 -00aa0eb7 -0aae8e93 -00200e13 -47d19063 -00006097 -52808093 -aa00b137 -a0010113 -0020a223 -0040a183 -aa00beb7 -a00e8e93 -00300e13 -43d19c63 -00006097 -50008093 -0aa01137 -aa010113 -0020a423 -0080a183 -0aa01eb7 -aa0e8e93 -00400e13 -41d19863 -00006097 -4d808093 -a00aa137 -00a10113 -0020a623 -00c0a183 -a00aaeb7 -00ae8e93 -00500e13 -3fd19463 -00006097 -4cc08093 -00aa0137 -0aa10113 -fe20aa23 -ff40a183 -00aa0eb7 -0aae8e93 -00600e13 -3dd19063 -00006097 -4a408093 -aa00b137 -a0010113 -fe20ac23 -ff80a183 -aa00beb7 -a00e8e93 -00700e13 -39d19c63 -00006097 -47c08093 -0aa01137 -aa010113 -fe20ae23 -ffc0a183 -0aa01eb7 -aa0e8e93 -00800e13 -37d19863 -00006097 -45408093 -a00aa137 -00a10113 -0020a023 -0000a183 -a00aaeb7 -00ae8e93 -00900e13 -35d19463 -00006097 -43008093 -12345137 -67810113 -fe008213 -02222023 -0000a183 -12345eb7 -678e8e93 -00a00e13 -31d19e63 -00006097 -40408093 -58213137 -09810113 -ffd08093 -0020a3a3 -00006217 -3f020213 -00022183 -58213eb7 -098e8e93 -00b00e13 -2fd19463 -00c00e13 -00000213 -aabbd0b7 -cdd08093 -00006117 -3a010113 -00112023 -00012183 -aabbdeb7 -cdde8e93 -2bd19e63 -00120213 -00200293 -fc521ae3 -00d00e13 -00000213 -daabc0b7 -ccd08093 -00006117 -36810113 -00000013 -00112223 -00412183 -daabceb7 -ccde8e93 -29d19063 -00120213 -00200293 -fc5218e3 -00e00e13 -00000213 -ddaac0b7 -bcc08093 -00006117 -32c10113 -00000013 -00000013 -00112423 -00812183 -ddaaceb7 -bcce8e93 -25d19063 -00120213 -00200293 -fc5216e3 -00f00e13 -00000213 -cddab0b7 -bbc08093 -00000013 -00006117 -2e810113 -00112623 -00c12183 -cddabeb7 -bbce8e93 -21d19263 -00120213 -00200293 -fc5218e3 -01000e13 -00000213 -ccddb0b7 -abb08093 -00000013 -00006117 -2ac10113 -00000013 -00112823 -01012183 -ccddbeb7 -abbe8e93 -1dd19263 -00120213 -00200293 -fc5216e3 -01100e13 -00000213 -bccde0b7 -aab08093 -00000013 -00000013 -00006117 -26810113 -00112a23 -01412183 -bccdeeb7 -aabe8e93 -19d19263 -00120213 -00200293 -fc5216e3 -01200e13 -00000213 -00006117 -23810113 -001120b7 -23308093 -00112023 -00012183 -00112eb7 -233e8e93 -15d19663 -00120213 -00200293 -fc521ae3 -01300e13 -00000213 -00006117 -20010113 -300110b7 -22308093 -00000013 -00112223 -00412183 -30011eb7 -223e8e93 -11d19863 -00120213 -00200293 -fc5218e3 -01400e13 -00000213 -00006117 -1c410113 -330010b7 -12208093 -00000013 -00000013 -00112423 -00812183 -33001eb7 -122e8e93 -0dd19863 -00120213 -00200293 -fc5216e3 -01500e13 -00000213 -00006117 -18410113 -00000013 -233000b7 -11208093 -00112623 -00c12183 -23300eb7 -112e8e93 -09d19a63 -00120213 -00200293 -fc5218e3 -01600e13 -00000213 -00006117 -14810113 -00000013 -223300b7 -01108093 -00000013 -00112823 -01012183 -22330eb7 -011e8e93 -05d19a63 -00120213 -00200293 -fc5216e3 -01700e13 -00000213 -00006117 -10810113 -00000013 -00000013 -122330b7 -00108093 -00112a23 -01412183 -12233eb7 -001e8e93 -01d19a63 -00120213 -00200293 -fc5216e3 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -da4fb06f -00005537 -fc050513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00656e62 -02e00593 -00b62023 -00b62023 -00200e13 -00000093 -00100113 -00209663 -2bc01a63 -01c01663 -fe209ee3 -2bc01463 -00300e13 -00100093 -00000113 -00209663 -29c01a63 -01c01663 -fe209ee3 -29c01463 -00400e13 -fff00093 -00100113 -00209663 -27c01a63 -01c01663 -fe209ee3 -27c01463 -00500e13 -00100093 -fff00113 -00209663 -25c01a63 -01c01663 -fe209ee3 -25c01463 -00600e13 -00000093 -00000113 -00209463 -01c01463 -23c01863 -fe209ee3 -00700e13 -00100093 -00100113 -00209463 -01c01463 -21c01a63 -fe209ee3 -00800e13 -fff00093 -fff00113 -00209463 -01c01463 -1fc01c63 -fe209ee3 -00900e13 -00000213 -00000093 -00000113 -1e209063 -00120213 -00200293 -fe5216e3 -00a00e13 -00000213 -00000093 -00000113 -00000013 -1a209e63 -00120213 -00200293 -fe5214e3 -00b00e13 -00000213 -00000093 -00000113 -00000013 -00000013 -18209a63 -00120213 -00200293 -fe5212e3 -00c00e13 -00000213 -00000093 -00000013 -00000113 -16209863 -00120213 -00200293 -fe5214e3 -00d00e13 -00000213 -00000093 -00000013 -00000113 -00000013 -14209463 -00120213 -00200293 -fe5212e3 -00e00e13 -00000213 -00000093 -00000013 -00000013 -00000113 -12209063 -00120213 -00200293 -fe5212e3 -00f00e13 -00000213 -00000093 -00000113 -10209063 -00120213 -00200293 -fe5216e3 -01000e13 -00000213 -00000093 -00000113 -00000013 -0c209e63 -00120213 -00200293 -fe5214e3 -01100e13 -00000213 -00000093 -00000113 -00000013 -00000013 -0a209a63 -00120213 -00200293 -fe5212e3 -01200e13 -00000213 -00000093 -00000013 -00000113 -08209863 -00120213 -00200293 -fe5214e3 -01300e13 -00000213 -00000093 -00000013 -00000113 -00000013 -06209463 -00120213 -00200293 -fe5212e3 -01400e13 -00000213 -00000093 -00000013 -00000013 -00000113 -04209063 -00120213 -00200293 -fe5212e3 -00100093 -00009a63 -00108093 -00108093 -00108093 -00108093 -00108093 -00108093 -00300e93 -01500e13 -01d09463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -9d0fb06f -00000000 -00005537 -30850513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -70697561 -00000063 -02e00593 -00b62023 -00b62023 -00000013 -00002517 -71c50513 -004005ef -40b50533 -00002eb7 -710e8e93 -00200e13 -03d51463 -ffffe517 -8fc50513 -004005ef -40b50533 -ffffeeb7 -8f0e8e93 -00300e13 -01d51463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8c4fb06f -00005537 -3d450513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -726c616a -00000000 -02e00593 -00b62023 -00b62023 -00200e13 -00000f93 -00000117 -01810113 -000109e7 -00000013 -00000013 -0e40006f -00000097 -ff008093 -00408093 -0d309a63 -00300e13 -00000f93 -00000197 -01418193 -00018067 -00000013 -0b80006f -0a0f9a63 -00400e13 -00000213 -00000317 -01030313 -000309e7 -09c01e63 -00120213 -00200293 -fe5214e3 -00500e13 -00000213 -00000317 -01430313 -00000013 -000309e7 -07c01a63 -00120213 -00200293 -fe5212e3 -00600e13 -00000213 -00000317 -01830313 -00000013 -00000013 -000309e7 -05c01463 -00120213 -00200293 -fe5210e3 -00100093 -00000117 -01c10113 -ffc109e7 -00108093 -00108093 -00108093 -00108093 -00108093 -00108093 -00400e93 -00700e13 -01d09463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -f65fa06f -00005537 -55850513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -75656762 -00000000 -02e00593 -00b62023 -00b62023 -00200e13 -00000093 -00000113 -0020f663 -35c01263 -01c01663 -fe20fee3 -33c01c63 -00300e13 -00100093 -00100113 -0020f663 -33c01263 -01c01663 -fe20fee3 -31c01c63 -00400e13 -fff00093 -fff00113 -0020f663 -31c01263 -01c01663 -fe20fee3 -2fc01c63 -00500e13 -00100093 -00000113 -0020f663 -2fc01263 -01c01663 -fe20fee3 -2dc01c63 -00600e13 -fff00093 -ffe00113 -0020f663 -2dc01263 -01c01663 -fe20fee3 -2bc01c63 -00700e13 -fff00093 -00000113 -0020f663 -2bc01263 -01c01663 -fe20fee3 -29c01c63 -00800e13 -00000093 -00100113 -0020f463 -01c01463 -29c01063 -fe20fee3 -00900e13 -ffe00093 -fff00113 -0020f463 -01c01463 -27c01263 -fe20fee3 -00a00e13 -00000093 -fff00113 -0020f463 -01c01463 -25c01463 -fe20fee3 -00b00e13 -800000b7 -fff08093 -80000137 -0020f463 -01c01463 -23c01463 -fe20fee3 -00c00e13 -00000213 -f00000b7 -fff08093 -f0000137 -2020f663 -00120213 -00200293 -fe5214e3 -00d00e13 -00000213 -f00000b7 -fff08093 -f0000137 -00000013 -1e20f263 -00120213 -00200293 -fe5212e3 -00e00e13 -00000213 -f00000b7 -fff08093 -f0000137 -00000013 -00000013 -1a20fc63 -00120213 -00200293 -fe5210e3 -00f00e13 -00000213 -f00000b7 -fff08093 -00000013 -f0000137 -1820f863 -00120213 -00200293 -fe5212e3 -01000e13 -00000213 -f00000b7 -fff08093 -00000013 -f0000137 -00000013 -1620f263 -00120213 -00200293 -fe5210e3 -01100e13 -00000213 -f00000b7 -fff08093 -00000013 -00000013 -f0000137 -1220fc63 -00120213 -00200293 -fe5210e3 -01200e13 -00000213 -f00000b7 -fff08093 -f0000137 -1020fa63 -00120213 -00200293 -fe5214e3 -01300e13 -00000213 -f00000b7 -fff08093 -f0000137 -00000013 -0e20f663 -00120213 -00200293 -fe5212e3 -01400e13 -00000213 -f00000b7 -fff08093 -f0000137 -00000013 -00000013 -0c20f063 -00120213 -00200293 -fe5210e3 -01500e13 -00000213 -f00000b7 -fff08093 -00000013 -f0000137 -0820fc63 -00120213 -00200293 -fe5212e3 -01600e13 -00000213 -f00000b7 -fff08093 -00000013 -f0000137 -00000013 -0620f663 -00120213 -00200293 -fe5210e3 -01700e13 -00000213 -f00000b7 -fff08093 -00000013 -00000013 -f0000137 -0420f063 -00120213 -00200293 -fe5210e3 -00100093 -0000fa63 -00108093 -00108093 -00108093 -00108093 -00108093 -00108093 -00300e93 -01800e13 -01d09463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -bd5fa06f -00006537 -93050513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -0000776c -02e00593 -00b62023 -00b62023 -00005097 -70408093 -0000a183 -00ff0eb7 -0ffe8e93 -00200e13 -27d19a63 -00005097 -6e808093 -0040a183 -ff010eb7 -f00e8e93 -00300e13 -25d19c63 -00005097 -6cc08093 -0080a183 -0ff01eb7 -ff0e8e93 -00400e13 -23d19e63 -00005097 -6b008093 -00c0a183 -f00ffeb7 -00fe8e93 -00500e13 -23d19063 -00005097 -6a008093 -ff40a183 -00ff0eb7 -0ffe8e93 -00600e13 -21d19263 -00005097 -68408093 -ff80a183 -ff010eb7 -f00e8e93 -00700e13 -1fd19463 -00005097 -66808093 -ffc0a183 -0ff01eb7 -ff0e8e93 -00800e13 -1dd19663 -00005097 -64c08093 -0000a183 -f00ffeb7 -00fe8e93 -00900e13 -1bd19863 -00005097 -62408093 -fe008093 -0200a183 -00ff0eb7 -0ffe8e93 -00a00e13 -19d19863 -00005097 -60408093 -ffd08093 -0070a183 -ff010eb7 -f00e8e93 -00b00e13 -17d19863 -00c00e13 -00000213 -00005097 -5e008093 -0040a183 -00018313 -0ff01eb7 -ff0e8e93 -15d31663 -00120213 -00200293 -fc521ee3 -00d00e13 -00000213 -00005097 -5b408093 -0040a183 -00000013 -00018313 -f00ffeb7 -00fe8e93 -11d31c63 -00120213 -00200293 -fc521ce3 -00e00e13 -00000213 -00005097 -57808093 -0040a183 -00000013 -00000013 -00018313 -ff010eb7 -f00e8e93 -0fd31063 -00120213 -00200293 -fc521ae3 -00f00e13 -00000213 -00005097 -54408093 -0040a183 -0ff01eb7 -ff0e8e93 -0bd19a63 -00120213 -00200293 -fe5210e3 -01000e13 -00000213 -00005097 -51c08093 -00000013 -0040a183 -f00ffeb7 -00fe8e93 -09d19263 -00120213 -00200293 -fc521ee3 -01100e13 -00000213 -00005097 -4e408093 -00000013 -00000013 -0040a183 -ff010eb7 -f00e8e93 -05d19863 -00120213 -00200293 -fc521ce3 -00005197 -4b818193 -0001a103 -00200113 -00200e93 -01200e13 -03d11463 -00005197 -49c18193 -0001a103 -00000013 -00200113 -00200e93 -01300e13 -01d11463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8edfa06f -00006537 -c3c50513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -686c756d -00000075 -02e00593 -00b62023 -00b62023 -00000093 -00000113 -0220b1b3 -00000e93 -00200e13 -4bd19a63 -00100093 -00100113 -0220b1b3 -00000e93 -00300e13 -49d19e63 -00300093 -00700113 -0220b1b3 -00000e93 -00400e13 -49d19263 -00000093 -ffff8137 -0220b1b3 -00000e93 -00500e13 -47d19663 -800000b7 -00000113 -0220b1b3 -00000e93 -00600e13 -45d19a63 -800000b7 -ffff8137 -0220b1b3 -7fffceb7 -00700e13 -43d19e63 -aaaab0b7 -aab08093 -00030137 -e7d10113 -0220b1b3 -00020eb7 -efee8e93 -01e00e13 -41d19c63 -000300b7 -e7d08093 -aaaab137 -aab10113 -0220b1b3 -00020eb7 -efee8e93 -01f00e13 -3fd19a63 -ff0000b7 -ff000137 -0220b1b3 -fe010eb7 -02000e13 -3dd19e63 -fff00093 -fff00113 -0220b1b3 -ffe00e93 -02100e13 -3dd19263 -fff00093 -00100113 -0220b1b3 -00000e93 -02200e13 -3bd19663 -00100093 -fff00113 -0220b1b3 -00000e93 -02300e13 -39d19a63 -00d000b7 -00b00137 -0220b0b3 -00009eb7 -f00e8e93 -00800e13 -37d09c63 -00e000b7 -00b00137 -0220b133 -0000aeb7 -a00e8e93 -00900e13 -35d11e63 -00d000b7 -0210b0b3 -0000beb7 -900e8e93 -00a00e13 -35d09263 -00000213 -00d000b7 -00b00137 -0220b1b3 -00018313 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -00b00e13 -31d31a63 -00000213 -00e000b7 -00b00137 -0220b1b3 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -00c00e13 -2fd31063 -00000213 -00f000b7 -00b00137 -0220b1b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -0000aeb7 -500e8e93 -00d00e13 -2bd31463 -00000213 -00d000b7 -00b00137 -0220b1b3 -00120213 -00200293 -fe5216e3 -00009eb7 -f00e8e93 -00e00e13 -27d19e63 -00000213 -00e000b7 -00b00137 -00000013 -0220b1b3 -00120213 -00200293 -fe5214e3 -0000aeb7 -a00e8e93 -00f00e13 -25d19663 -00000213 -00f000b7 -00b00137 -00000013 -00000013 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01000e13 -21d19c63 -00000213 -00d000b7 -00000013 -00b00137 -0220b1b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01100e13 -1fd19463 -00000213 -00e000b7 -00000013 -00b00137 -00000013 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01200e13 -1bd19a63 -00000213 -00f000b7 -00000013 -00000013 -00b00137 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01300e13 -19d19063 -00000213 -00b00137 -00d000b7 -0220b1b3 -00120213 -00200293 -fe5216e3 -00009eb7 -f00e8e93 -01400e13 -15d19a63 -00000213 -00b00137 -00e000b7 -00000013 -0220b1b3 -00120213 -00200293 -fe5214e3 -0000aeb7 -a00e8e93 -01500e13 -13d19263 -00000213 -00b00137 -00f000b7 -00000013 -00000013 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01600e13 -0fd19863 -00000213 -00b00137 -00000013 -00d000b7 -0220b1b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01700e13 -0dd19063 -00000213 -00b00137 -00000013 -00e000b7 -00000013 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01800e13 -09d19663 -00000213 -00b00137 -00000013 -00000013 -00f000b7 -0220b1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01900e13 -05d19c63 -7c0000b7 -02103133 -00000e93 -01a00e13 -05d11263 -800000b7 -0200b133 -00000e93 -01b00e13 -03d11863 -020030b3 -00000e93 -01c00e13 -03d09063 -021000b7 -02200137 -0220b033 -00000e93 -01d00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -cccfa06f -00006537 -18850513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -69746c73 -00000000 -02e00593 -00b62023 -00b62023 -00000093 -0000a193 -00000e93 -00200e13 -27d19263 -00100093 -0010a193 -00000e93 -00300e13 -25d19863 -00300093 -0070a193 -00100e93 -00400e13 -23d19e63 -00700093 -0030a193 -00000e93 -00500e13 -23d19463 -00000093 -8000a193 -00000e93 -00600e13 -21d19a63 -800000b7 -0000a193 -00100e93 -00700e13 -21d19063 -800000b7 -8000a193 -00100e93 -00800e13 -1fd19663 -00000093 -7ff0a193 -00100e93 -00900e13 -1dd19c63 -800000b7 -fff08093 -0000a193 -00000e93 -00a00e13 -1dd19063 -800000b7 -fff08093 -7ff0a193 -00000e93 -00b00e13 -1bd19463 -800000b7 -7ff0a193 -00100e93 -00c00e13 -19d19a63 -800000b7 -fff08093 -8000a193 -00000e93 -00d00e13 -17d19e63 -00000093 -fff0a193 -00000e93 -00e00e13 -17d19463 -fff00093 -0010a193 -00100e93 -00f00e13 -15d19a63 -fff00093 -fff0a193 -00000e93 -01000e13 -15d19063 -00b00093 -00d0b093 -00100e93 -01100e13 -13d09663 -00000213 -00f00093 -00a0a193 -00018313 -00120213 -00200293 -fe5216e3 -00000e93 -01200e13 -11d31263 -00000213 -00a00093 -0100a193 -00000013 -00018313 -00120213 -00200293 -fe5214e3 -00100e93 -01300e13 -0dd31c63 -00000213 -01000093 -0090a193 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -00000e93 -01400e13 -0bd31463 -00000213 -00b00093 -00f0a193 -00120213 -00200293 -fe5218e3 -00100e93 -01500e13 -09d19263 -00000213 -01100093 -00000013 -0080a193 -00120213 -00200293 -fe5216e3 -00000e93 -01600e13 -05d19e63 -00000213 -00c00093 -00000013 -00000013 -00e0a193 -00120213 -00200293 -fe5214e3 -00100e93 -01700e13 -03d19863 -fff02093 -00000e93 -01800e13 -03d09063 -00ff00b7 -0ff08093 -fff0a013 -00000e93 -01900e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8fcfa06f -00006537 -48050513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00746c73 -02e00593 -00b62023 -00b62023 -00000093 -00000113 -0020a1b3 -00000e93 -00200e13 -4bd19a63 -00100093 -00100113 -0020a1b3 -00000e93 -00300e13 -49d19e63 -00300093 -00700113 -0020a1b3 -00100e93 -00400e13 -49d19263 -00700093 -00300113 -0020a1b3 -00000e93 -00500e13 -47d19663 -00000093 -ffff8137 -0020a1b3 -00000e93 -00600e13 -45d19a63 -800000b7 -00000113 -0020a1b3 -00100e93 -00700e13 -43d19e63 -800000b7 -ffff8137 -0020a1b3 -00100e93 -00800e13 -43d19263 -00000093 -00008137 -fff10113 -0020a1b3 -00100e93 -00900e13 -41d19463 -800000b7 -fff08093 -00000113 -0020a1b3 -00000e93 -00a00e13 -3fd19663 -800000b7 -fff08093 -00008137 -fff10113 -0020a1b3 -00000e93 -00b00e13 -3dd19663 -800000b7 -00008137 -fff10113 -0020a1b3 -00100e93 -00c00e13 -3bd19863 -800000b7 -fff08093 -ffff8137 -0020a1b3 -00000e93 -00d00e13 -39d19a63 -00000093 -fff00113 -0020a1b3 -00000e93 -00e00e13 -37d19e63 -fff00093 -00100113 -0020a1b3 -00100e93 -00f00e13 -37d19263 -fff00093 -fff00113 -0020a1b3 -00000e93 -01000e13 -35d19663 -00e00093 -00d00113 -0020a0b3 -00000e93 -01100e13 -33d09a63 -00b00093 -00d00113 -0020a133 -00100e93 -01200e13 -31d11e63 -00d00093 -0010a0b3 -00000e93 -01300e13 -31d09463 -00000213 -00b00093 -00d00113 -0020a1b3 -00018313 -00120213 -00200293 -fe5214e3 -00100e93 -01400e13 -2dd31e63 -00000213 -00e00093 -00d00113 -0020a1b3 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -00000e93 -01500e13 -2bd31663 -00000213 -00c00093 -00d00113 -0020a1b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -00100e93 -01600e13 -27d31c63 -00000213 -00e00093 -00d00113 -0020a1b3 -00120213 -00200293 -fe5216e3 -00000e93 -01700e13 -25d19863 -00000213 -00b00093 -00d00113 -00000013 -0020a1b3 -00120213 -00200293 -fe5214e3 -00100e93 -01800e13 -23d19263 -00000213 -00f00093 -00d00113 -00000013 -00000013 -0020a1b3 -00120213 -00200293 -fe5212e3 -00000e93 -01900e13 -1fd19a63 -00000213 -00a00093 -00000013 -00d00113 -0020a1b3 -00120213 -00200293 -fe5214e3 -00100e93 -01a00e13 -1dd19463 -00000213 -01000093 -00000013 -00d00113 -00000013 -0020a1b3 -00120213 -00200293 -fe5212e3 -00000e93 -01b00e13 -19d19c63 -00000213 -00900093 -00000013 -00000013 -00d00113 -0020a1b3 -00120213 -00200293 -fe5212e3 -00100e93 -01c00e13 -17d19463 -00000213 -00d00113 -01100093 -0020a1b3 -00120213 -00200293 -fe5216e3 -00000e93 -01d00e13 -15d19063 -00000213 -00d00113 -00800093 -00000013 -0020a1b3 -00120213 -00200293 -fe5214e3 -00100e93 -01e00e13 -11d19a63 -00000213 -00d00113 -01200093 -00000013 -00000013 -0020a1b3 -00120213 -00200293 -fe5212e3 -00000e93 -01f00e13 -0fd19263 -00000213 -00d00113 -00000013 -00700093 -0020a1b3 -00120213 -00200293 -fe5214e3 -00100e93 -02000e13 -0bd19c63 -00000213 -00d00113 -00000013 -01300093 -00000013 -0020a1b3 -00120213 -00200293 -fe5212e3 -00000e93 -02100e13 -09d19463 -00000213 -00d00113 -00000013 -00000013 -00600093 -0020a1b3 -00120213 -00200293 -fe5212e3 -00100e93 -02200e13 -05d19c63 -fff00093 -00102133 -00000e93 -02300e13 -05d11263 -fff00093 -0000a133 -00100e93 -02400e13 -03d11863 -000020b3 -00000e93 -02500e13 -03d09063 -01000093 -01e00113 -0020a033 -00000e93 -02600e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -c2df906f -00007537 -9c850513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -0075626c -02e00593 -00b62023 -00b62023 -00004097 -67c08093 -0000c183 -0ff00e93 -00200e13 -23d19c63 -00004097 -66408093 -0010c183 -00000e93 -00300e13 -23d19063 -00004097 -64c08093 -0020c183 -0f000e93 -00400e13 -21d19463 -00004097 -63408093 -0030c183 -00f00e93 -00500e13 -1fd19863 -00004097 -61f08093 -ffd0c183 -0ff00e93 -00600e13 -1dd19c63 -00004097 -60708093 -ffe0c183 -00000e93 -00700e13 -1dd19063 -00004097 -5ef08093 -fff0c183 -0f000e93 -00800e13 -1bd19463 -00004097 -5d708093 -0000c183 -00f00e93 -00900e13 -19d19863 -00004097 -5bc08093 -fe008093 -0200c183 -0ff00e93 -00a00e13 -17d19a63 -00004097 -5a008093 -ffa08093 -0070c183 -00000e93 -00b00e13 -15d19c63 -00c00e13 -00000213 -00004097 -57d08093 -0010c183 -00018313 -0f000e93 -13d31c63 -00120213 -00200293 -fe5210e3 -00d00e13 -00000213 -00004097 -55208093 -0010c183 -00000013 -00018313 -00f00e93 -11d31463 -00120213 -00200293 -fc521ee3 -00e00e13 -00000213 -00004097 -52008093 -0010c183 -00000013 -00000013 -00018313 -00000e93 -0dd31a63 -00120213 -00200293 -fc521ce3 -00f00e13 -00000213 -00004097 -4ed08093 -0010c183 -0f000e93 -0bd19663 -00120213 -00200293 -fe5212e3 -01000e13 -00000213 -00004097 -4c608093 -00000013 -0010c183 -00f00e93 -09d19063 -00120213 -00200293 -fe5210e3 -01100e13 -00000213 -00004097 -49808093 -00000013 -00000013 -0010c183 -00000e93 -05d19863 -00120213 -00200293 -fc521ee3 -00004197 -47018193 -0001c103 -00200113 -00200e93 -01200e13 -03d11463 -00004197 -45418193 -0001c103 -00000013 -00200113 -00200e93 -01300e13 -01d11463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8a1f906f -00007537 -c9450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -0075686c -02e00593 -00b62023 -00b62023 -00004097 -3b408093 -0000d183 -0ff00e93 -00200e13 -27d19663 -00004097 -39c08093 -0020d183 -00010eb7 -f00e8e93 -00300e13 -25d19863 -00004097 -38008093 -0040d183 -00001eb7 -ff0e8e93 -00400e13 -23d19a63 -00004097 -36408093 -0060d183 -0000feb7 -00fe8e93 -00500e13 -21d19c63 -00004097 -34e08093 -ffa0d183 -0ff00e93 -00600e13 -21d19063 -00004097 -33608093 -ffc0d183 -00010eb7 -f00e8e93 -00700e13 -1fd19263 -00004097 -31a08093 -ffe0d183 -00001eb7 -ff0e8e93 -00800e13 -1dd19463 -00004097 -2fe08093 -0000d183 -0000feb7 -00fe8e93 -00900e13 -1bd19663 -00004097 -2dc08093 -fe008093 -0200d183 -0ff00e93 -00a00e13 -19d19863 -00004097 -2c008093 -ffb08093 -0070d183 -00010eb7 -f00e8e93 -00b00e13 -17d19863 -00c00e13 -00000213 -00004097 -29a08093 -0020d183 -00018313 -00001eb7 -ff0e8e93 -15d31663 -00120213 -00200293 -fc521ee3 -00d00e13 -00000213 -00004097 -26c08093 -0020d183 -00000013 -00018313 -0000feb7 -00fe8e93 -11d31c63 -00120213 -00200293 -fc521ce3 -00e00e13 -00000213 -00004097 -23408093 -0020d183 -00000013 -00000013 -00018313 -00010eb7 -f00e8e93 -0fd31063 -00120213 -00200293 -fc521ae3 -00f00e13 -00000213 -00004097 -1fe08093 -0020d183 -00001eb7 -ff0e8e93 -0bd19a63 -00120213 -00200293 -fe5210e3 -01000e13 -00000213 -00004097 -1d408093 -00000013 -0020d183 -0000feb7 -00fe8e93 -09d19263 -00120213 -00200293 -fc521ee3 -01100e13 -00000213 -00004097 -1a008093 -00000013 -00000013 -0020d183 -00010eb7 -f00e8e93 -05d19863 -00120213 -00200293 -fc521ce3 -00004197 -17418193 -0001d103 -00200113 -00200e93 -01200e13 -03d11463 -00004197 -15818193 -0001d103 -00000013 -00200113 -00200e93 -01300e13 -01d11463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -dacf906f -00007537 -f9450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00006873 -02e00593 -00b62023 -00b62023 -00004097 -0bc08093 -0aa00113 -00209023 -00009183 -0aa00e93 -00200e13 -45d19e63 -00004097 -09c08093 -ffffb137 -a0010113 -00209123 -00209183 -ffffbeb7 -a00e8e93 -00300e13 -43d19a63 -00004097 -07408093 -beef1137 -aa010113 -00209223 -0040a183 -beef1eb7 -aa0e8e93 -00400e13 -41d19663 -00004097 -04c08093 -ffffa137 -00a10113 -00209323 -00609183 -ffffaeb7 -00ae8e93 -00500e13 -3fd19263 -00004097 -03208093 -0aa00113 -fe209d23 -ffa09183 -0aa00e93 -00600e13 -3dd19263 -00004097 -01208093 -ffffb137 -a0010113 -fe209e23 -ffc09183 -ffffbeb7 -a00e8e93 -00700e13 -39d19e63 -00004097 -fea08093 -00001137 -aa010113 -fe209f23 -ffe09183 -00001eb7 -aa0e8e93 -00800e13 -37d19a63 -00004097 -fc208093 -ffffa137 -00a10113 -00209023 -00009183 -ffffaeb7 -00ae8e93 -00900e13 -35d19663 -00004097 -f9c08093 -12345137 -67810113 -fe008213 -02221023 -00009183 -00005eb7 -678e8e93 -00a00e13 -33d19063 -00004097 -f7008093 -00003137 -09810113 -ffb08093 -002093a3 -00004217 -f5a20213 -00021183 -00003eb7 -098e8e93 -00b00e13 -2fd19663 -00c00e13 -00000213 -ffffd0b7 -cdd08093 -00004117 -f1c10113 -00111023 -00011183 -ffffdeb7 -cdde8e93 -2dd19063 -00120213 -00200293 -fc521ae3 -00d00e13 -00000213 -ffffc0b7 -ccd08093 -00004117 -ee410113 -00000013 -00111123 -00211183 -ffffceb7 -ccde8e93 -29d19263 -00120213 -00200293 -fc5218e3 -00e00e13 -00000213 -ffffc0b7 -bcc08093 -00004117 -ea810113 -00000013 -00000013 -00111223 -00411183 -ffffceb7 -bcce8e93 -25d19263 -00120213 -00200293 -fc5216e3 -00f00e13 -00000213 -ffffb0b7 -bbc08093 -00000013 -00004117 -e6410113 -00111323 -00611183 -ffffbeb7 -bbce8e93 -21d19463 -00120213 -00200293 -fc5218e3 -01000e13 -00000213 -ffffb0b7 -abb08093 -00000013 -00004117 -e2810113 -00000013 -00111423 -00811183 -ffffbeb7 -abbe8e93 -1dd19463 -00120213 -00200293 -fc5216e3 -01100e13 -00000213 -ffffe0b7 -aab08093 -00000013 -00000013 -00004117 -de410113 -00111523 -00a11183 -ffffeeb7 -aabe8e93 -19d19463 -00120213 -00200293 -fc5216e3 -01200e13 -00000213 -00004117 -db410113 -000020b7 -23308093 -00111023 -00011183 -00002eb7 -233e8e93 -15d19863 -00120213 -00200293 -fc521ae3 -01300e13 -00000213 -00004117 -d7c10113 -000010b7 -22308093 -00000013 -00111123 -00211183 -00001eb7 -223e8e93 -11d19a63 -00120213 -00200293 -fc5218e3 -01400e13 -00000213 -00004117 -d4010113 -000010b7 -12208093 -00000013 -00000013 -00111223 -00411183 -00001eb7 -122e8e93 -0dd19a63 -00120213 -00200293 -fc5216e3 -01500e13 -00000213 -00004117 -d0010113 -00000013 -11200093 -00111323 -00611183 -11200e93 -0bd19063 -00120213 -00200293 -fc521ce3 -01600e13 -00000213 -00004117 -ccc10113 -00000013 -01100093 -00000013 -00111423 -00811183 -01100e93 -07d19463 -00120213 -00200293 -fc521ae3 -01700e13 -00000213 -00004117 -c9410113 -00000013 -00000013 -000030b7 -00108093 -00111523 -00a11183 -00003eb7 -001e8e93 -03d19463 -00120213 -00200293 -fc5216e3 -0000c537 -eef50513 -00004597 -c5458593 -00a59323 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -8ccf906f -00007537 -48c50513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -0069756c -02e00593 -00b62023 -00b62023 -000000b7 -00000e93 -00200e13 -05d09a63 -fffff0b7 -4010d093 -80000e93 -00300e13 -05d09063 -7ffff0b7 -4140d093 -7ff00e93 -00400e13 -03d09663 -800000b7 -4140d093 -80000e93 -00500e13 -01d09c63 -80000037 -00000e93 -00600e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -f21f806f -00007537 -56c50513 +de5fc06f +00003537 +7e050513 10000637 00050583 00058c63 @@ -7726,577 +3787,178 @@ fe5210e3 00b52023 00c52023 00d52023 -c15f806f -00008537 -8e450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -006c6c73 -02e00593 -00b62023 -00b62023 -00100093 -00000113 -002091b3 -00100e93 -00200e13 -55d19c63 -00100093 -00100113 -002091b3 -00200e93 -00300e13 -55d19063 -00100093 -00700113 -002091b3 -08000e93 -00400e13 -53d19463 -00100093 -00e00113 -002091b3 -00004eb7 -00500e13 -51d19863 -00100093 -01f00113 -002091b3 -80000eb7 -00600e13 -4fd19c63 -fff00093 -00000113 -002091b3 -fff00e93 -00700e13 -4fd19063 -fff00093 -00100113 -002091b3 -ffe00e93 -00800e13 -4dd19463 -fff00093 -00700113 -002091b3 -f8000e93 -00900e13 -4bd19863 -fff00093 -00e00113 -002091b3 -ffffceb7 -00a00e13 -49d19c63 -fff00093 -01f00113 -002091b3 -80000eb7 -00b00e13 -49d19063 -212120b7 -12108093 -00000113 -002091b3 -21212eb7 -121e8e93 -00c00e13 -47d19063 -212120b7 -12108093 -00100113 -002091b3 -42424eb7 -242e8e93 -00d00e13 -45d19063 -212120b7 -12108093 -00700113 -002091b3 -90909eb7 -080e8e93 -00e00e13 -43d19063 -212120b7 -12108093 -00e00113 -002091b3 -48484eb7 -00f00e13 -41d19263 -212120b7 -12108093 -01f00113 -002091b3 -80000eb7 -01000e13 -3fd19463 -212120b7 -12108093 -fe000113 -002091b3 -21212eb7 -121e8e93 -01100e13 -3dd19463 -212120b7 -12108093 -fe100113 -002091b3 -42424eb7 -242e8e93 -01200e13 -3bd19463 -212120b7 -12108093 -fe700113 -002091b3 -90909eb7 -080e8e93 -01300e13 -39d19463 -212120b7 -12108093 -fee00113 -002091b3 -48484eb7 -01400e13 -37d19663 -212120b7 -12008093 -fff00113 -002091b3 -00000e93 -01500e13 -35d19863 -00100093 -00700113 -002090b3 -08000e93 -01600e13 -33d09c63 -00100093 -00e00113 -00209133 -00004eb7 -01700e13 -33d11063 -00300093 -001090b3 -01800e93 -01800e13 -31d09663 -00000213 -00100093 -00700113 -002091b3 -00018313 -00120213 -00200293 -fe5214e3 -08000e93 -01900e13 -2fd31063 -00000213 -00100093 -00e00113 -002091b3 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -00004eb7 -01a00e13 -2bd31863 -00000213 -00100093 -01f00113 -002091b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -80000eb7 -01b00e13 -27d31e63 -00000213 -00100093 -00700113 -002091b3 -00120213 -00200293 -fe5216e3 -08000e93 -01c00e13 -25d19a63 -00000213 -00100093 -00e00113 -00000013 -002091b3 -00120213 -00200293 -fe5214e3 -00004eb7 -01d00e13 -23d19463 -00000213 -00100093 -01f00113 -00000013 -00000013 -002091b3 -00120213 -00200293 -fe5212e3 -80000eb7 -01e00e13 -1fd19c63 -00000213 -00100093 -00000013 -00700113 -002091b3 -00120213 -00200293 -fe5214e3 -08000e93 -01f00e13 -1dd19663 -00000213 -00100093 -00000013 -00e00113 -00000013 -002091b3 -00120213 -00200293 -fe5212e3 -00004eb7 -02000e13 -19d19e63 -00000213 -00100093 -00000013 -00000013 -01f00113 -002091b3 -00120213 -00200293 -fe5212e3 -80000eb7 -02100e13 -17d19663 -00000213 -00700113 -00100093 -002091b3 -00120213 -00200293 -fe5216e3 -08000e93 -02200e13 -15d19263 -00000213 -00e00113 -00100093 -00000013 -002091b3 -00120213 -00200293 -fe5214e3 -00004eb7 -02300e13 -11d19c63 -00000213 -01f00113 -00100093 -00000013 -00000013 -002091b3 -00120213 -00200293 -fe5212e3 -80000eb7 -02400e13 -0fd19463 -00000213 -00700113 -00000013 -00100093 -002091b3 -00120213 -00200293 -fe5214e3 -08000e93 -02500e13 -0bd19e63 -00000213 -00e00113 -00000013 -00100093 -00000013 -002091b3 -00120213 -00200293 -fe5212e3 -00004eb7 -02600e13 -09d19663 -00000213 -01f00113 -00000013 -00000013 -00100093 -002091b3 -00120213 -00200293 -fe5212e3 -80000eb7 -02700e13 -05d19e63 -00f00093 -00101133 -00000e93 -02800e13 -05d11463 -02000093 -00009133 -02000e93 -02900e13 -03d11a63 -000010b3 -00000e93 -02a00e13 -03d09263 -40000093 -00001137 -80010113 -00209033 -00000e93 -02b00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -f18f806f -00008537 -ed050513 +9a1fc06f +00004537 +b5850513 10000637 00050583 00058c63 00b62023 00150513 ff1ff06f -706d6973 -0000656c -02e00593 -00b62023 -00b62023 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -f78f806f -00008537 -f2450513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -696c6c73 +69646461 00000000 02e00593 00b62023 00b62023 -00100093 -00009193 -00100e93 +00000093 +00008193 +00000e93 00200e13 -27d19a63 +27d19c63 00100093 -00109193 +00108193 00200e93 00300e13 -27d19063 -00100093 -00709193 -08000e93 +27d19263 +00300093 +00708193 +00a00e93 00400e13 -25d19663 -00100093 -00e09193 -00004eb7 +25d19863 +00000093 +80008193 +80000e93 00500e13 -23d19c63 -00100093 -01f09193 +23d19e63 +800000b7 +00008193 80000eb7 00600e13 -23d19263 -fff00093 -00009193 -fff00e93 +23d19463 +800000b7 +80008193 +80000eb7 +800e8e93 00700e13 21d19863 -fff00093 -00109193 -ffe00e93 +00000093 +7ff08193 +7ff00e93 00800e13 1fd19e63 -fff00093 -00709193 -f8000e93 -00900e13 -1fd19463 -fff00093 -00e09193 -ffffceb7 -00a00e13 -1dd19a63 -fff00093 -01f09193 +800000b7 +fff08093 +00008193 80000eb7 +fffe8e93 +00900e13 +1fd19063 +800000b7 +fff08093 +7ff08193 +80000eb7 +7fee8e93 +00a00e13 +1dd19263 +800000b7 +7ff08193 +80000eb7 +7ffe8e93 00b00e13 -1dd19063 -212120b7 -12108093 -00009193 -21212eb7 -121e8e93 +1bd19663 +800000b7 +fff08093 +80008193 +7ffffeb7 +7ffe8e93 00c00e13 -1bd19263 -212120b7 -12108093 -00109193 -42424eb7 -242e8e93 +19d19863 +00000093 +fff08193 +fff00e93 00d00e13 -19d19463 -212120b7 -12108093 -00709193 -90909eb7 -080e8e93 +17d19e63 +fff00093 +00108193 +00000e93 00e00e13 -17d19663 -212120b7 -12108093 -00e09193 -48484eb7 +17d19463 +fff00093 +fff08193 +ffe00e93 00f00e13 15d19a63 -212120b7 -12108093 -01f09193 +800000b7 +fff08093 +00108193 80000eb7 01000e13 13d19e63 -00100093 -00709093 -08000e93 +00d00093 +00b08093 +01800e93 01100e13 13d09463 00000213 -00100093 -00709193 +00d00093 +00b08193 00018313 00120213 00200293 fe5216e3 -08000e93 +01800e93 01200e13 11d31063 00000213 -00100093 -00e09193 +00d00093 +00a08193 00000013 00018313 00120213 00200293 fe5214e3 -00004eb7 +01700e93 01300e13 0dd31a63 00000213 -00100093 -01f09193 +00d00093 +00908193 00000013 00000013 00018313 00120213 00200293 fe5212e3 -80000eb7 +01600e93 01400e13 0bd31263 00000213 -00100093 -00709193 +00d00093 +00b08193 00120213 00200293 fe5218e3 -08000e93 +01800e93 01500e13 09d19063 00000213 -00100093 +00d00093 00000013 -00e09193 +00a08193 00120213 00200293 fe5216e3 -00004eb7 +01700e93 01600e13 05d19c63 00000213 -00100093 +00d00093 00000013 00000013 -01f09193 +00908193 00120213 00200293 fe5214e3 -80000eb7 +01600e93 01700e13 03d19663 -01f01093 -00000e93 +02000093 +02000e93 01800e13 01d09e63 02100093 -01409013 +03208013 00000e93 01900e13 01d01463 @@ -8320,946 +3982,185 @@ fe5214e3 00b52023 00c52023 00d52023 -b80f806f -00008537 -22c50513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -756d6572 -00000000 -02e00593 -00b62023 -00b62023 -01400093 -00600113 -0220f1b3 -00200e93 -00200e13 -0dd19463 -fec00093 -00600113 -0220f1b3 -00200e93 -00300e13 -0bd19863 -01400093 -ffa00113 -0220f1b3 -01400e93 -00400e13 -09d19c63 -fec00093 -ffa00113 -0220f1b3 -fec00e93 -00500e13 -09d19063 -800000b7 -00100113 -0220f1b3 -00000e93 -00600e13 -07d19463 -800000b7 -fff00113 -0220f1b3 -80000eb7 -00700e13 -05d19863 -800000b7 -00000113 -0220f1b3 -80000eb7 -00800e13 -03d19c63 -00100093 -00000113 -0220f1b3 -00100e93 -00900e13 -03d19063 -00000093 -00000113 -0220f1b3 -00000e93 -00a00e13 -01d19463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -b04f806f -00008537 -38c50513 +f0cfc06f +00004537 +e6450513 10000637 00050583 00058a63 00b62023 00150513 ff1ff06f -0069726f -02e00593 -00b62023 -00b62023 -ff0100b7 -f0008093 -f0f0e193 -f0f00e93 -00200e13 -1dd19463 -0ff010b7 -ff008093 -0f00e193 -0ff01eb7 -ff0e8e93 -00300e13 -1bd19663 -00ff00b7 -0ff08093 -70f0e193 -00ff0eb7 -7ffe8e93 -00400e13 -19d19863 -f00ff0b7 -00f08093 -0f00e193 -f00ffeb7 -0ffe8e93 -00500e13 -17d19a63 -ff0100b7 -f0008093 -0f00e093 -ff010eb7 -ff0e8e93 -00600e13 -15d09c63 -00000213 -0ff010b7 -ff008093 -0f00e193 -00018313 -00120213 -00200293 -fe5214e3 -0ff01eb7 -ff0e8e93 -00700e13 -13d31463 -00000213 -00ff00b7 -0ff08093 -70f0e193 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -00ff0eb7 -7ffe8e93 -00800e13 -0fd31a63 -00000213 -f00ff0b7 -00f08093 -0f00e193 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -f00ffeb7 -0ffe8e93 -00900e13 -0bd31e63 -00000213 -0ff010b7 -ff008093 -0f00e193 -00120213 -00200293 -fe5216e3 -0ff01eb7 -ff0e8e93 -00a00e13 -09d19863 -00000213 -00ff00b7 -0ff08093 -00000013 -f0f0e193 -00120213 -00200293 -fe5214e3 -fff00e93 -00b00e13 -07d19263 -00000213 -f00ff0b7 -00f08093 -00000013 -00000013 -0f00e193 -00120213 -00200293 -fe5212e3 -f00ffeb7 -0ffe8e93 -00c00e13 -03d19863 -0f006093 -0f000e93 -00d00e13 -03d09063 -00ff00b7 -0ff08093 -70f0e013 -00000e93 -00e00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -fadf706f -00008537 -5e850513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00006273 -02e00593 -00b62023 -00b62023 -00003097 -a7c08093 -faa00113 -00208023 -00008183 -faa00e93 -00200e13 -3dd19c63 -00003097 -a5c08093 -00000113 -002080a3 -00108183 -00000e93 -00300e13 -3bd19c63 -00003097 -a3c08093 -fffff137 -fa010113 -00208123 -00209183 -fffffeb7 -fa0e8e93 -00400e13 -39d19863 -00003097 -a1408093 -00a00113 -002081a3 -00308183 -00a00e93 -00500e13 -37d19863 -00003097 -9fb08093 -faa00113 -fe208ea3 -ffd08183 -faa00e93 -00600e13 -35d19863 -00003097 -9db08093 -00000113 -fe208f23 -ffe08183 -00000e93 -00700e13 -33d19863 -00003097 -9bb08093 -fa000113 -fe208fa3 -fff08183 -fa000e93 -00800e13 -31d19863 -00003097 -99b08093 -00a00113 -00208023 -00008183 -00a00e93 -00900e13 -2fd19863 -00003097 -97c08093 -12345137 -67810113 -fe008213 -02220023 -00008183 -07800e93 -00a00e13 -2dd19463 -00003097 -95408093 -00003137 -09810113 -ffa08093 -002083a3 -00003217 -93d20213 -00020183 -f9800e93 -00b00e13 -29d19c63 -00c00e13 -00000213 -fdd00093 -00003117 -91010113 -00110023 -00010183 -fdd00e93 -27d19a63 -00120213 -00200293 -fc521ee3 -00d00e13 -00000213 -fcd00093 -00003117 -8e010113 -00000013 -001100a3 -00110183 -fcd00e93 -25d19063 -00120213 -00200293 -fc521ce3 -00e00e13 -00000213 -fcc00093 -00003117 -8ac10113 -00000013 -00000013 -00110123 -00210183 -fcc00e93 -21d19463 -00120213 -00200293 -fc521ae3 -00f00e13 -00000213 -fbc00093 -00000013 -00003117 -87010113 -001101a3 -00310183 -fbc00e93 -1dd19a63 -00120213 -00200293 -fc521ce3 -01000e13 -00000213 -fbb00093 -00000013 -00003117 -83c10113 -00000013 -00110223 -00410183 -fbb00e93 -19d19e63 -00120213 -00200293 -fc521ae3 -01100e13 -00000213 -fab00093 -00000013 -00000013 -00003117 -80010113 -001102a3 -00510183 -fab00e93 -17d19263 -00120213 -00200293 -fc521ae3 -01200e13 -00000213 -00002117 -7d410113 -03300093 -00110023 -00010183 -03300e93 -13d19a63 -00120213 -00200293 -fc521ee3 -01300e13 -00000213 -00002117 -7a410113 -02300093 -00000013 -001100a3 -00110183 -02300e93 -11d19063 -00120213 -00200293 -fc521ce3 -01400e13 -00000213 -00002117 -77010113 -02200093 -00000013 -00000013 -00110123 -00210183 -02200e93 -0dd19463 -00120213 -00200293 -fc521ae3 -01500e13 -00000213 -00002117 -73810113 -00000013 -01200093 -001101a3 -00310183 -01200e93 -09d19a63 -00120213 -00200293 -fc521ce3 -01600e13 -00000213 -00002117 -70410113 -00000013 -01100093 -00000013 -00110223 -00410183 -01100e93 -05d19e63 -00120213 -00200293 -fc521ae3 -01700e13 -00000213 -00002117 -6cc10113 -00000013 -00000013 -00100093 -001102a3 -00510183 -00100e93 -03d19263 -00120213 -00200293 -fc521ae3 -0ef00513 -00002597 -69858593 -00a581a3 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -af1f706f -00009537 -a5c50513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -006c616a +00716562 02e00593 00b62023 00b62023 00200e13 00000093 -010000ef -00000013 -00000013 -0440006f -00000117 -ff010113 -00410113 -02111a63 -00100113 -014000ef -00110113 -00110113 -00110113 -00110113 -00110113 -00110113 -00300e93 -00300e13 -01d11463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -97df706f -00009537 -b3450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -00646461 -02e00593 -00b62023 -00b62023 -00000093 00000113 -002081b3 -00000e93 -00200e13 -4dd19663 +00208663 +2bc01863 +01c01663 +fe208ee3 +2bc01263 +00300e13 00100093 00100113 -002081b3 -00200e93 -00300e13 -4bd19a63 -00300093 -00700113 -002081b3 -00a00e93 +00208663 +29c01863 +01c01663 +fe208ee3 +29c01263 00400e13 -49d19e63 -00000093 -ffff8137 -002081b3 -ffff8eb7 -00500e13 -49d19263 -800000b7 -00000113 -002081b3 -80000eb7 -00600e13 -47d19663 -800000b7 -ffff8137 -002081b3 -7fff8eb7 -00700e13 -45d19a63 -00000093 -00008137 -fff10113 -002081b3 -00008eb7 -fffe8e93 -00800e13 -43d19a63 -800000b7 -fff08093 -00000113 -002081b3 -80000eb7 -fffe8e93 -00900e13 -41d19a63 -800000b7 -fff08093 -00008137 -fff10113 -002081b3 -80008eb7 -ffee8e93 -00a00e13 -3fd19863 -800000b7 -00008137 -fff10113 -002081b3 -80008eb7 -fffe8e93 -00b00e13 -3dd19863 -800000b7 -fff08093 -ffff8137 -002081b3 -7fff8eb7 -fffe8e93 -00c00e13 -3bd19863 -00000093 -fff00113 -002081b3 -fff00e93 -00d00e13 -39d19c63 -fff00093 -00100113 -002081b3 -00000e93 -00e00e13 -39d19063 fff00093 fff00113 -002081b3 -ffe00e93 +00208663 +27c01863 +01c01663 +fe208ee3 +27c01263 +00500e13 +00000093 +00100113 +00208463 +01c01463 +25c01663 +fe208ee3 +00600e13 +00100093 +00000113 +00208463 +01c01463 +23c01863 +fe208ee3 +00700e13 +fff00093 +00100113 +00208463 +01c01463 +21c01a63 +fe208ee3 +00800e13 +00100093 +fff00113 +00208463 +01c01463 +1fc01c63 +fe208ee3 +00900e13 +00000213 +00000093 +fff00113 +1e208063 +00120213 +00200293 +fe5216e3 +00a00e13 +00000213 +00000093 +fff00113 +00000013 +1a208e63 +00120213 +00200293 +fe5214e3 +00b00e13 +00000213 +00000093 +fff00113 +00000013 +00000013 +18208a63 +00120213 +00200293 +fe5212e3 +00c00e13 +00000213 +00000093 +00000013 +fff00113 +16208863 +00120213 +00200293 +fe5214e3 +00d00e13 +00000213 +00000093 +00000013 +fff00113 +00000013 +14208463 +00120213 +00200293 +fe5212e3 +00e00e13 +00000213 +00000093 +00000013 +00000013 +fff00113 +12208063 +00120213 +00200293 +fe5212e3 00f00e13 -37d19463 -00100093 -80000137 -fff10113 -002081b3 -80000eb7 +00000213 +00000093 +fff00113 +10208063 +00120213 +00200293 +fe5216e3 01000e13 -35d19663 -00d00093 -00b00113 -002080b3 -01800e93 +00000213 +00000093 +fff00113 +00000013 +0c208e63 +00120213 +00200293 +fe5214e3 01100e13 -33d09a63 -00e00093 -00b00113 -00208133 -01900e93 +00000213 +00000093 +fff00113 +00000013 +00000013 +0a208a63 +00120213 +00200293 +fe5212e3 01200e13 -31d11e63 -00d00093 -001080b3 -01a00e93 +00000213 +00000093 +00000013 +fff00113 +08208863 +00120213 +00200293 +fe5214e3 01300e13 -31d09463 00000213 -00d00093 -00b00113 -002081b3 -00018313 +00000093 +00000013 +fff00113 +00000013 +06208463 00120213 00200293 -fe5214e3 -01800e93 +fe5212e3 01400e13 -2dd31e63 00000213 -00e00093 -00b00113 -002081b3 +00000093 00000013 -00018313 +00000013 +fff00113 +04208063 00120213 00200293 fe5212e3 -01900e93 -01500e13 -2bd31663 -00000213 -00f00093 -00b00113 -002081b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -01a00e93 -01600e13 -27d31c63 -00000213 -00d00093 -00b00113 -002081b3 -00120213 -00200293 -fe5216e3 -01800e93 -01700e13 -25d19863 -00000213 -00e00093 -00b00113 -00000013 -002081b3 -00120213 -00200293 -fe5214e3 -01900e93 -01800e13 -23d19263 -00000213 -00f00093 -00b00113 -00000013 -00000013 -002081b3 -00120213 -00200293 -fe5212e3 -01a00e93 -01900e13 -1fd19a63 -00000213 -00d00093 -00000013 -00b00113 -002081b3 -00120213 -00200293 -fe5214e3 -01800e93 -01a00e13 -1dd19463 -00000213 -00e00093 -00000013 -00b00113 -00000013 -002081b3 -00120213 -00200293 -fe5212e3 -01900e93 -01b00e13 -19d19c63 -00000213 -00f00093 -00000013 -00000013 -00b00113 -002081b3 -00120213 -00200293 -fe5212e3 -01a00e93 -01c00e13 -17d19463 -00000213 -00b00113 -00d00093 -002081b3 -00120213 -00200293 -fe5216e3 -01800e93 -01d00e13 -15d19063 -00000213 -00b00113 -00e00093 -00000013 -002081b3 -00120213 -00200293 -fe5214e3 -01900e93 -01e00e13 -11d19a63 -00000213 -00b00113 -00f00093 -00000013 -00000013 -002081b3 -00120213 -00200293 -fe5212e3 -01a00e93 -01f00e13 -0fd19263 -00000213 -00b00113 -00000013 -00d00093 -002081b3 -00120213 -00200293 -fe5214e3 -01800e93 -02000e13 -0bd19c63 -00000213 -00b00113 -00000013 -00e00093 -00000013 -002081b3 -00120213 -00200293 -fe5212e3 -01900e93 -02100e13 -09d19463 -00000213 -00b00113 -00000013 -00000013 -00f00093 -002081b3 -00120213 -00200293 -fe5212e3 -01a00e93 -02200e13 -05d19c63 -00f00093 -00100133 -00f00e93 -02300e13 -05d11263 -02000093 -00008133 -02000e93 -02400e13 -03d11863 -000000b3 -00000e93 -02500e13 -03d09063 -01000093 -01e00113 -00208033 -00000e93 -02600e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -d3cf706f -00009537 -09450513 -10000637 -00050583 -00058a63 -00b62023 -00150513 -ff1ff06f -0000006a -02e00593 -00b62023 -00b62023 -00200e13 -0080006f -0340006f 00100093 -0140006f +00000a63 00108093 00108093 00108093 @@ -9267,7 +4168,7 @@ ff1ff06f 00108093 00108093 00300e93 -00300e13 +01500e13 01d09463 03c01a63 10000537 @@ -9289,154 +4190,9 @@ ff1ff06f 00b52023 00c52023 00d52023 -b54f706f -00009537 -15050513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -69646e61 -00000000 -02e00593 -00b62023 -00b62023 -ff0100b7 -f0008093 -f0f0f193 -ff010eb7 -f00e8e93 -00200e13 -1bd19463 -0ff010b7 -ff008093 -0f00f193 -0f000e93 -00300e13 -19d19863 -00ff00b7 -0ff08093 -70f0f193 -00f00e93 -00400e13 -17d19c63 -f00ff0b7 -00f08093 -0f00f193 -00000e93 -00500e13 -17d19063 -ff0100b7 -f0008093 -0f00f093 -00000e93 -00600e13 -15d09463 -00000213 -0ff010b7 -ff008093 -70f0f193 -00018313 -00120213 -00200293 -fe5214e3 -70000e93 -00700e13 -11d31e63 -00000213 -00ff00b7 -0ff08093 -0f00f193 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -0f000e93 -00800e13 -0fd31663 -00000213 -f00ff0b7 -00f08093 -f0f0f193 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -f00ffeb7 -00fe8e93 -00900e13 -0bd31a63 -00000213 -0ff010b7 -ff008093 -70f0f193 -00120213 -00200293 -fe5216e3 -70000e93 -00a00e13 -09d19663 -00000213 -00ff00b7 -0ff08093 -00000013 -0f00f193 -00120213 -00200293 -fe5214e3 -0f000e93 -00b00e13 -07d19063 -00000213 -f00ff0b7 -00f08093 -00000013 -00000013 -70f0f193 -00120213 -00200293 -fe5212e3 -00f00e93 -00c00e13 -03d19863 -0f007093 -00000e93 -00d00e13 -03d09063 -00ff00b7 -0ff08093 -70f0f013 -00000e93 -00e00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -a0cf706f -00009537 -39450513 +b24fc06f +00004537 +1a450513 10000637 00050583 00058a63 @@ -9825,9 +4581,4228 @@ fff00e93 00b52023 00c52023 00d52023 -c69f606f -0000a537 -9b050513 +e59fb06f +00004537 +7c050513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00007773 +02e00593 +00b62023 +00b62023 +00005097 +c5408093 +00aa0137 +0aa10113 +0020a023 +0000a183 +00aa0eb7 +0aae8e93 +00200e13 +47d19063 +00005097 +c2c08093 +aa00b137 +a0010113 +0020a223 +0040a183 +aa00beb7 +a00e8e93 +00300e13 +43d19c63 +00005097 +c0408093 +0aa01137 +aa010113 +0020a423 +0080a183 +0aa01eb7 +aa0e8e93 +00400e13 +41d19863 +00005097 +bdc08093 +a00aa137 +00a10113 +0020a623 +00c0a183 +a00aaeb7 +00ae8e93 +00500e13 +3fd19463 +00005097 +bd008093 +00aa0137 +0aa10113 +fe20aa23 +ff40a183 +00aa0eb7 +0aae8e93 +00600e13 +3dd19063 +00005097 +ba808093 +aa00b137 +a0010113 +fe20ac23 +ff80a183 +aa00beb7 +a00e8e93 +00700e13 +39d19c63 +00005097 +b8008093 +0aa01137 +aa010113 +fe20ae23 +ffc0a183 +0aa01eb7 +aa0e8e93 +00800e13 +37d19863 +00005097 +b5808093 +a00aa137 +00a10113 +0020a023 +0000a183 +a00aaeb7 +00ae8e93 +00900e13 +35d19463 +00005097 +b3408093 +12345137 +67810113 +fe008213 +02222023 +0000a183 +12345eb7 +678e8e93 +00a00e13 +31d19e63 +00005097 +b0808093 +58213137 +09810113 +ffd08093 +0020a3a3 +00005217 +af420213 +00022183 +58213eb7 +098e8e93 +00b00e13 +2fd19463 +00c00e13 +00000213 +aabbd0b7 +cdd08093 +00005117 +aa410113 +00112023 +00012183 +aabbdeb7 +cdde8e93 +2bd19e63 +00120213 +00200293 +fc521ae3 +00d00e13 +00000213 +daabc0b7 +ccd08093 +00005117 +a6c10113 +00000013 +00112223 +00412183 +daabceb7 +ccde8e93 +29d19063 +00120213 +00200293 +fc5218e3 +00e00e13 +00000213 +ddaac0b7 +bcc08093 +00005117 +a3010113 +00000013 +00000013 +00112423 +00812183 +ddaaceb7 +bcce8e93 +25d19063 +00120213 +00200293 +fc5216e3 +00f00e13 +00000213 +cddab0b7 +bbc08093 +00000013 +00005117 +9ec10113 +00112623 +00c12183 +cddabeb7 +bbce8e93 +21d19263 +00120213 +00200293 +fc5218e3 +01000e13 +00000213 +ccddb0b7 +abb08093 +00000013 +00005117 +9b010113 +00000013 +00112823 +01012183 +ccddbeb7 +abbe8e93 +1dd19263 +00120213 +00200293 +fc5216e3 +01100e13 +00000213 +bccde0b7 +aab08093 +00000013 +00000013 +00005117 +96c10113 +00112a23 +01412183 +bccdeeb7 +aabe8e93 +19d19263 +00120213 +00200293 +fc5216e3 +01200e13 +00000213 +00005117 +93c10113 +001120b7 +23308093 +00112023 +00012183 +00112eb7 +233e8e93 +15d19663 +00120213 +00200293 +fc521ae3 +01300e13 +00000213 +00005117 +90410113 +300110b7 +22308093 +00000013 +00112223 +00412183 +30011eb7 +223e8e93 +11d19863 +00120213 +00200293 +fc5218e3 +01400e13 +00000213 +00005117 +8c810113 +330010b7 +12208093 +00000013 +00000013 +00112423 +00812183 +33001eb7 +122e8e93 +0dd19863 +00120213 +00200293 +fc5216e3 +01500e13 +00000213 +00005117 +88810113 +00000013 +233000b7 +11208093 +00112623 +00c12183 +23300eb7 +112e8e93 +09d19a63 +00120213 +00200293 +fc5218e3 +01600e13 +00000213 +00005117 +84c10113 +00000013 +223300b7 +01108093 +00000013 +00112823 +01012183 +22330eb7 +011e8e93 +05d19a63 +00120213 +00200293 +fc5216e3 +01700e13 +00000213 +00005117 +80c10113 +00000013 +00000013 +122330b7 +00108093 +00112a23 +01412183 +12233eb7 +001e8e93 +01d19a63 +00120213 +00200293 +fc5216e3 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +8a1fb06f +00000000 +00005537 +cc850513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +70697561 +00000063 +02e00593 +00b62023 +00b62023 +00000013 +00002517 +71c50513 +004005ef +40b50533 +00002eb7 +710e8e93 +00200e13 +03d51463 +ffffe517 +8fc50513 +004005ef +40b50533 +ffffeeb7 +8f0e8e93 +00300e13 +01d51463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +f04fb06f +00005537 +d9450513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +726c616a +00000000 +02e00593 +00b62023 +00b62023 +00200e13 +00000f93 +00000117 +01810113 +000109e7 +00000013 +00000013 +0e40006f +00000097 +ff008093 +00408093 +0d309a63 +00300e13 +00000f93 +00000197 +01418193 +00018067 +00000013 +0b80006f +0a0f9a63 +00400e13 +00000213 +00000317 +01030313 +000309e7 +09c01e63 +00120213 +00200293 +fe5214e3 +00500e13 +00000213 +00000317 +01430313 +00000013 +000309e7 +07c01a63 +00120213 +00200293 +fe5212e3 +00600e13 +00000213 +00000317 +01830313 +00000013 +00000013 +000309e7 +05c01463 +00120213 +00200293 +fe5210e3 +00100093 +00000117 +01c10113 +ffc109e7 +00108093 +00108093 +00108093 +00108093 +00108093 +00108093 +00400e93 +00700e13 +01d09463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +da4fb06f +00005537 +f1850513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +75656762 +00000000 +02e00593 +00b62023 +00b62023 +00200e13 +00000093 +00000113 +0020f663 +35c01263 +01c01663 +fe20fee3 +33c01c63 +00300e13 +00100093 +00100113 +0020f663 +33c01263 +01c01663 +fe20fee3 +31c01c63 +00400e13 +fff00093 +fff00113 +0020f663 +31c01263 +01c01663 +fe20fee3 +2fc01c63 +00500e13 +00100093 +00000113 +0020f663 +2fc01263 +01c01663 +fe20fee3 +2dc01c63 +00600e13 +fff00093 +ffe00113 +0020f663 +2dc01263 +01c01663 +fe20fee3 +2bc01c63 +00700e13 +fff00093 +00000113 +0020f663 +2bc01263 +01c01663 +fe20fee3 +29c01c63 +00800e13 +00000093 +00100113 +0020f463 +01c01463 +29c01063 +fe20fee3 +00900e13 +ffe00093 +fff00113 +0020f463 +01c01463 +27c01263 +fe20fee3 +00a00e13 +00000093 +fff00113 +0020f463 +01c01463 +25c01463 +fe20fee3 +00b00e13 +800000b7 +fff08093 +80000137 +0020f463 +01c01463 +23c01463 +fe20fee3 +00c00e13 +00000213 +f00000b7 +fff08093 +f0000137 +2020f663 +00120213 +00200293 +fe5214e3 +00d00e13 +00000213 +f00000b7 +fff08093 +f0000137 +00000013 +1e20f263 +00120213 +00200293 +fe5212e3 +00e00e13 +00000213 +f00000b7 +fff08093 +f0000137 +00000013 +00000013 +1a20fc63 +00120213 +00200293 +fe5210e3 +00f00e13 +00000213 +f00000b7 +fff08093 +00000013 +f0000137 +1820f863 +00120213 +00200293 +fe5212e3 +01000e13 +00000213 +f00000b7 +fff08093 +00000013 +f0000137 +00000013 +1620f263 +00120213 +00200293 +fe5210e3 +01100e13 +00000213 +f00000b7 +fff08093 +00000013 +00000013 +f0000137 +1220fc63 +00120213 +00200293 +fe5210e3 +01200e13 +00000213 +f00000b7 +fff08093 +f0000137 +1020fa63 +00120213 +00200293 +fe5214e3 +01300e13 +00000213 +f00000b7 +fff08093 +f0000137 +00000013 +0e20f663 +00120213 +00200293 +fe5212e3 +01400e13 +00000213 +f00000b7 +fff08093 +f0000137 +00000013 +00000013 +0c20f063 +00120213 +00200293 +fe5210e3 +01500e13 +00000213 +f00000b7 +fff08093 +00000013 +f0000137 +0820fc63 +00120213 +00200293 +fe5212e3 +01600e13 +00000213 +f00000b7 +fff08093 +00000013 +f0000137 +00000013 +0620f663 +00120213 +00200293 +fe5210e3 +01700e13 +00000213 +f00000b7 +fff08093 +00000013 +00000013 +f0000137 +0420f063 +00120213 +00200293 +fe5210e3 +00100093 +0000fa63 +00108093 +00108093 +00108093 +00108093 +00108093 +00108093 +00300e93 +01800e13 +01d09463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +a14fb06f +00005537 +2f050513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0000776c +02e00593 +00b62023 +00b62023 +00004097 +14c08093 +0000a183 +00ff0eb7 +0ffe8e93 +00200e13 +27d19a63 +00004097 +13008093 +0040a183 +ff010eb7 +f00e8e93 +00300e13 +25d19c63 +00004097 +11408093 +0080a183 +0ff01eb7 +ff0e8e93 +00400e13 +23d19e63 +00004097 +0f808093 +00c0a183 +f00ffeb7 +00fe8e93 +00500e13 +23d19063 +00004097 +0e808093 +ff40a183 +00ff0eb7 +0ffe8e93 +00600e13 +21d19263 +00004097 +0cc08093 +ff80a183 +ff010eb7 +f00e8e93 +00700e13 +1fd19463 +00004097 +0b008093 +ffc0a183 +0ff01eb7 +ff0e8e93 +00800e13 +1dd19663 +00004097 +09408093 +0000a183 +f00ffeb7 +00fe8e93 +00900e13 +1bd19863 +00004097 +06c08093 +fe008093 +0200a183 +00ff0eb7 +0ffe8e93 +00a00e13 +19d19863 +00004097 +04c08093 +ffd08093 +0070a183 +ff010eb7 +f00e8e93 +00b00e13 +17d19863 +00c00e13 +00000213 +00004097 +02808093 +0040a183 +00018313 +0ff01eb7 +ff0e8e93 +15d31663 +00120213 +00200293 +fc521ee3 +00d00e13 +00000213 +00004097 +ffc08093 +0040a183 +00000013 +00018313 +f00ffeb7 +00fe8e93 +11d31c63 +00120213 +00200293 +fc521ce3 +00e00e13 +00000213 +00004097 +fc008093 +0040a183 +00000013 +00000013 +00018313 +ff010eb7 +f00e8e93 +0fd31063 +00120213 +00200293 +fc521ae3 +00f00e13 +00000213 +00004097 +f8c08093 +0040a183 +0ff01eb7 +ff0e8e93 +0bd19a63 +00120213 +00200293 +fe5210e3 +01000e13 +00000213 +00004097 +f6408093 +00000013 +0040a183 +f00ffeb7 +00fe8e93 +09d19263 +00120213 +00200293 +fc521ee3 +01100e13 +00000213 +00004097 +f2c08093 +00000013 +00000013 +0040a183 +ff010eb7 +f00e8e93 +05d19863 +00120213 +00200293 +fc521ce3 +00004197 +f0018193 +0001a103 +00200113 +00200e93 +01200e13 +03d11463 +00004197 +ee418193 +0001a103 +00000013 +00200113 +00200e93 +01300e13 +01d11463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +f2dfa06f +00005537 +5fc50513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +69746c73 +00000000 +02e00593 +00b62023 +00b62023 +00000093 +0000a193 +00000e93 +00200e13 +27d19263 +00100093 +0010a193 +00000e93 +00300e13 +25d19863 +00300093 +0070a193 +00100e93 +00400e13 +23d19e63 +00700093 +0030a193 +00000e93 +00500e13 +23d19463 +00000093 +8000a193 +00000e93 +00600e13 +21d19a63 +800000b7 +0000a193 +00100e93 +00700e13 +21d19063 +800000b7 +8000a193 +00100e93 +00800e13 +1fd19663 +00000093 +7ff0a193 +00100e93 +00900e13 +1dd19c63 +800000b7 +fff08093 +0000a193 +00000e93 +00a00e13 +1dd19063 +800000b7 +fff08093 +7ff0a193 +00000e93 +00b00e13 +1bd19463 +800000b7 +7ff0a193 +00100e93 +00c00e13 +19d19a63 +800000b7 +fff08093 +8000a193 +00000e93 +00d00e13 +17d19e63 +00000093 +fff0a193 +00000e93 +00e00e13 +17d19463 +fff00093 +0010a193 +00100e93 +00f00e13 +15d19a63 +fff00093 +fff0a193 +00000e93 +01000e13 +15d19063 +00b00093 +00d0b093 +00100e93 +01100e13 +13d09663 +00000213 +00f00093 +00a0a193 +00018313 +00120213 +00200293 +fe5216e3 +00000e93 +01200e13 +11d31263 +00000213 +00a00093 +0100a193 +00000013 +00018313 +00120213 +00200293 +fe5214e3 +00100e93 +01300e13 +0dd31c63 +00000213 +01000093 +0090a193 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +00000e93 +01400e13 +0bd31463 +00000213 +00b00093 +00f0a193 +00120213 +00200293 +fe5218e3 +00100e93 +01500e13 +09d19263 +00000213 +01100093 +00000013 +0080a193 +00120213 +00200293 +fe5216e3 +00000e93 +01600e13 +05d19e63 +00000213 +00c00093 +00000013 +00000013 +00e0a193 +00120213 +00200293 +fe5214e3 +00100e93 +01700e13 +03d19863 +fff02093 +00000e93 +01800e13 +03d09063 +00ff00b7 +0ff08093 +fff0a013 +00000e93 +01900e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +c89fa06f +00006537 +8f450513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00746c73 +02e00593 +00b62023 +00b62023 +00000093 +00000113 +0020a1b3 +00000e93 +00200e13 +4bd19a63 +00100093 +00100113 +0020a1b3 +00000e93 +00300e13 +49d19e63 +00300093 +00700113 +0020a1b3 +00100e93 +00400e13 +49d19263 +00700093 +00300113 +0020a1b3 +00000e93 +00500e13 +47d19663 +00000093 +ffff8137 +0020a1b3 +00000e93 +00600e13 +45d19a63 +800000b7 +00000113 +0020a1b3 +00100e93 +00700e13 +43d19e63 +800000b7 +ffff8137 +0020a1b3 +00100e93 +00800e13 +43d19263 +00000093 +00008137 +fff10113 +0020a1b3 +00100e93 +00900e13 +41d19463 +800000b7 +fff08093 +00000113 +0020a1b3 +00000e93 +00a00e13 +3fd19663 +800000b7 +fff08093 +00008137 +fff10113 +0020a1b3 +00000e93 +00b00e13 +3dd19663 +800000b7 +00008137 +fff10113 +0020a1b3 +00100e93 +00c00e13 +3bd19863 +800000b7 +fff08093 +ffff8137 +0020a1b3 +00000e93 +00d00e13 +39d19a63 +00000093 +fff00113 +0020a1b3 +00000e93 +00e00e13 +37d19e63 +fff00093 +00100113 +0020a1b3 +00100e93 +00f00e13 +37d19263 +fff00093 +fff00113 +0020a1b3 +00000e93 +01000e13 +35d19663 +00e00093 +00d00113 +0020a0b3 +00000e93 +01100e13 +33d09a63 +00b00093 +00d00113 +0020a133 +00100e93 +01200e13 +31d11e63 +00d00093 +0010a0b3 +00000e93 +01300e13 +31d09463 +00000213 +00b00093 +00d00113 +0020a1b3 +00018313 +00120213 +00200293 +fe5214e3 +00100e93 +01400e13 +2dd31e63 +00000213 +00e00093 +00d00113 +0020a1b3 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +00000e93 +01500e13 +2bd31663 +00000213 +00c00093 +00d00113 +0020a1b3 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5210e3 +00100e93 +01600e13 +27d31c63 +00000213 +00e00093 +00d00113 +0020a1b3 +00120213 +00200293 +fe5216e3 +00000e93 +01700e13 +25d19863 +00000213 +00b00093 +00d00113 +00000013 +0020a1b3 +00120213 +00200293 +fe5214e3 +00100e93 +01800e13 +23d19263 +00000213 +00f00093 +00d00113 +00000013 +00000013 +0020a1b3 +00120213 +00200293 +fe5212e3 +00000e93 +01900e13 +1fd19a63 +00000213 +00a00093 +00000013 +00d00113 +0020a1b3 +00120213 +00200293 +fe5214e3 +00100e93 +01a00e13 +1dd19463 +00000213 +01000093 +00000013 +00d00113 +00000013 +0020a1b3 +00120213 +00200293 +fe5212e3 +00000e93 +01b00e13 +19d19c63 +00000213 +00900093 +00000013 +00000013 +00d00113 +0020a1b3 +00120213 +00200293 +fe5212e3 +00100e93 +01c00e13 +17d19463 +00000213 +00d00113 +01100093 +0020a1b3 +00120213 +00200293 +fe5216e3 +00000e93 +01d00e13 +15d19063 +00000213 +00d00113 +00800093 +00000013 +0020a1b3 +00120213 +00200293 +fe5214e3 +00100e93 +01e00e13 +11d19a63 +00000213 +00d00113 +01200093 +00000013 +00000013 +0020a1b3 +00120213 +00200293 +fe5212e3 +00000e93 +01f00e13 +0fd19263 +00000213 +00d00113 +00000013 +00700093 +0020a1b3 +00120213 +00200293 +fe5214e3 +00100e93 +02000e13 +0bd19c63 +00000213 +00d00113 +00000013 +01300093 +00000013 +0020a1b3 +00120213 +00200293 +fe5212e3 +00000e93 +02100e13 +09d19463 +00000213 +00d00113 +00000013 +00000013 +00600093 +0020a1b3 +00120213 +00200293 +fe5212e3 +00100e93 +02200e13 +05d19c63 +fff00093 +00102133 +00000e93 +02300e13 +05d11263 +fff00093 +0000a133 +00100e93 +02400e13 +03d11863 +000020b3 +00000e93 +02500e13 +03d09063 +01000093 +01e00113 +0020a033 +00000e93 +02600e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +fb8fa06f +00006537 +e3c50513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0075626c +02e00593 +00b62023 +00b62023 +00003097 +61008093 +0000c183 +0ff00e93 +00200e13 +23d19c63 +00003097 +5f808093 +0010c183 +00000e93 +00300e13 +23d19063 +00003097 +5e008093 +0020c183 +0f000e93 +00400e13 +21d19463 +00003097 +5c808093 +0030c183 +00f00e93 +00500e13 +1fd19863 +00003097 +5b308093 +ffd0c183 +0ff00e93 +00600e13 +1dd19c63 +00003097 +59b08093 +ffe0c183 +00000e93 +00700e13 +1dd19063 +00003097 +58308093 +fff0c183 +0f000e93 +00800e13 +1bd19463 +00003097 +56b08093 +0000c183 +00f00e93 +00900e13 +19d19863 +00003097 +55008093 +fe008093 +0200c183 +0ff00e93 +00a00e13 +17d19a63 +00003097 +53408093 +ffa08093 +0070c183 +00000e93 +00b00e13 +15d19c63 +00c00e13 +00000213 +00003097 +51108093 +0010c183 +00018313 +0f000e93 +13d31c63 +00120213 +00200293 +fe5210e3 +00d00e13 +00000213 +00003097 +4e608093 +0010c183 +00000013 +00018313 +00f00e93 +11d31463 +00120213 +00200293 +fc521ee3 +00e00e13 +00000213 +00003097 +4b408093 +0010c183 +00000013 +00000013 +00018313 +00000e93 +0dd31a63 +00120213 +00200293 +fc521ce3 +00f00e13 +00000213 +00003097 +48108093 +0010c183 +0f000e93 +0bd19663 +00120213 +00200293 +fe5212e3 +01000e13 +00000213 +00003097 +45a08093 +00000013 +0010c183 +00f00e93 +09d19063 +00120213 +00200293 +fe5210e3 +01100e13 +00000213 +00003097 +42c08093 +00000013 +00000013 +0010c183 +00000e93 +05d19863 +00120213 +00200293 +fc521ee3 +00003197 +40418193 +0001c103 +00200113 +00200e93 +01200e13 +03d11463 +00003197 +3e818193 +0001c103 +00000013 +00200113 +00200e93 +01300e13 +01d11463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +c2cfa06f +00006537 +10850513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0075686c +02e00593 +00b62023 +00b62023 +00003097 +34808093 +0000d183 +0ff00e93 +00200e13 +27d19663 +00003097 +33008093 +0020d183 +00010eb7 +f00e8e93 +00300e13 +25d19863 +00003097 +31408093 +0040d183 +00001eb7 +ff0e8e93 +00400e13 +23d19a63 +00003097 +2f808093 +0060d183 +0000feb7 +00fe8e93 +00500e13 +21d19c63 +00003097 +2e208093 +ffa0d183 +0ff00e93 +00600e13 +21d19063 +00003097 +2ca08093 +ffc0d183 +00010eb7 +f00e8e93 +00700e13 +1fd19263 +00003097 +2ae08093 +ffe0d183 +00001eb7 +ff0e8e93 +00800e13 +1dd19463 +00003097 +29208093 +0000d183 +0000feb7 +00fe8e93 +00900e13 +1bd19663 +00003097 +27008093 +fe008093 +0200d183 +0ff00e93 +00a00e13 +19d19863 +00003097 +25408093 +ffb08093 +0070d183 +00010eb7 +f00e8e93 +00b00e13 +17d19863 +00c00e13 +00000213 +00003097 +22e08093 +0020d183 +00018313 +00001eb7 +ff0e8e93 +15d31663 +00120213 +00200293 +fc521ee3 +00d00e13 +00000213 +00003097 +20008093 +0020d183 +00000013 +00018313 +0000feb7 +00fe8e93 +11d31c63 +00120213 +00200293 +fc521ce3 +00e00e13 +00000213 +00003097 +1c808093 +0020d183 +00000013 +00000013 +00018313 +00010eb7 +f00e8e93 +0fd31063 +00120213 +00200293 +fc521ae3 +00f00e13 +00000213 +00003097 +19208093 +0020d183 +00001eb7 +ff0e8e93 +0bd19a63 +00120213 +00200293 +fe5210e3 +01000e13 +00000213 +00003097 +16808093 +00000013 +0020d183 +0000feb7 +00fe8e93 +09d19263 +00120213 +00200293 +fc521ee3 +01100e13 +00000213 +00003097 +13408093 +00000013 +00000013 +0020d183 +00010eb7 +f00e8e93 +05d19863 +00120213 +00200293 +fc521ce3 +00003197 +10818193 +0001d103 +00200113 +00200e93 +01200e13 +03d11463 +00003197 +0ec18193 +0001d103 +00000013 +00200113 +00200e93 +01300e13 +01d11463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +938fa06f +00006537 +40850513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0069756c +02e00593 +00b62023 +00b62023 +000000b7 +00000e93 +00200e13 +05d09a63 +fffff0b7 +4010d093 +80000e93 +00300e13 +05d09063 +7ffff0b7 +4140d093 +7ff00e93 +00400e13 +03d09663 +800000b7 +4140d093 +80000e93 +00500e13 +01d09c63 +80000037 +00000e93 +00600e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +fa5f906f +00006537 +4e850513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +006c6c73 +02e00593 +00b62023 +00b62023 +00100093 +00000113 +002091b3 +00100e93 +00200e13 +55d19c63 +00100093 +00100113 +002091b3 +00200e93 +00300e13 +55d19063 +00100093 +00700113 +002091b3 +08000e93 +00400e13 +53d19463 +00100093 +00e00113 +002091b3 +00004eb7 +00500e13 +51d19863 +00100093 +01f00113 +002091b3 +80000eb7 +00600e13 +4fd19c63 +fff00093 +00000113 +002091b3 +fff00e93 +00700e13 +4fd19063 +fff00093 +00100113 +002091b3 +ffe00e93 +00800e13 +4dd19463 +fff00093 +00700113 +002091b3 +f8000e93 +00900e13 +4bd19863 +fff00093 +00e00113 +002091b3 +ffffceb7 +00a00e13 +49d19c63 +fff00093 +01f00113 +002091b3 +80000eb7 +00b00e13 +49d19063 +212120b7 +12108093 +00000113 +002091b3 +21212eb7 +121e8e93 +00c00e13 +47d19063 +212120b7 +12108093 +00100113 +002091b3 +42424eb7 +242e8e93 +00d00e13 +45d19063 +212120b7 +12108093 +00700113 +002091b3 +90909eb7 +080e8e93 +00e00e13 +43d19063 +212120b7 +12108093 +00e00113 +002091b3 +48484eb7 +00f00e13 +41d19263 +212120b7 +12108093 +01f00113 +002091b3 +80000eb7 +01000e13 +3fd19463 +212120b7 +12108093 +fe000113 +002091b3 +21212eb7 +121e8e93 +01100e13 +3dd19463 +212120b7 +12108093 +fe100113 +002091b3 +42424eb7 +242e8e93 +01200e13 +3bd19463 +212120b7 +12108093 +fe700113 +002091b3 +90909eb7 +080e8e93 +01300e13 +39d19463 +212120b7 +12108093 +fee00113 +002091b3 +48484eb7 +01400e13 +37d19663 +212120b7 +12008093 +fff00113 +002091b3 +00000e93 +01500e13 +35d19863 +00100093 +00700113 +002090b3 +08000e93 +01600e13 +33d09c63 +00100093 +00e00113 +00209133 +00004eb7 +01700e13 +33d11063 +00300093 +001090b3 +01800e93 +01800e13 +31d09663 +00000213 +00100093 +00700113 +002091b3 +00018313 +00120213 +00200293 +fe5214e3 +08000e93 +01900e13 +2fd31063 +00000213 +00100093 +00e00113 +002091b3 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +00004eb7 +01a00e13 +2bd31863 +00000213 +00100093 +01f00113 +002091b3 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5210e3 +80000eb7 +01b00e13 +27d31e63 +00000213 +00100093 +00700113 +002091b3 +00120213 +00200293 +fe5216e3 +08000e93 +01c00e13 +25d19a63 +00000213 +00100093 +00e00113 +00000013 +002091b3 +00120213 +00200293 +fe5214e3 +00004eb7 +01d00e13 +23d19463 +00000213 +00100093 +01f00113 +00000013 +00000013 +002091b3 +00120213 +00200293 +fe5212e3 +80000eb7 +01e00e13 +1fd19c63 +00000213 +00100093 +00000013 +00700113 +002091b3 +00120213 +00200293 +fe5214e3 +08000e93 +01f00e13 +1dd19663 +00000213 +00100093 +00000013 +00e00113 +00000013 +002091b3 +00120213 +00200293 +fe5212e3 +00004eb7 +02000e13 +19d19e63 +00000213 +00100093 +00000013 +00000013 +01f00113 +002091b3 +00120213 +00200293 +fe5212e3 +80000eb7 +02100e13 +17d19663 +00000213 +00700113 +00100093 +002091b3 +00120213 +00200293 +fe5216e3 +08000e93 +02200e13 +15d19263 +00000213 +00e00113 +00100093 +00000013 +002091b3 +00120213 +00200293 +fe5214e3 +00004eb7 +02300e13 +11d19c63 +00000213 +01f00113 +00100093 +00000013 +00000013 +002091b3 +00120213 +00200293 +fe5212e3 +80000eb7 +02400e13 +0fd19463 +00000213 +00700113 +00000013 +00100093 +002091b3 +00120213 +00200293 +fe5214e3 +08000e93 +02500e13 +0bd19e63 +00000213 +00e00113 +00000013 +00100093 +00000013 +002091b3 +00120213 +00200293 +fe5212e3 +00004eb7 +02600e13 +09d19663 +00000213 +01f00113 +00000013 +00000013 +00100093 +002091b3 +00120213 +00200293 +fe5212e3 +80000eb7 +02700e13 +05d19e63 +00f00093 +00101133 +00000e93 +02800e13 +05d11463 +02000093 +00009133 +02000e93 +02900e13 +03d11a63 +000010b3 +00000e93 +02a00e13 +03d09263 +40000093 +00001137 +80010113 +00209033 +00000e93 +02b00e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +b15f906f +00007537 +ad450513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +696c6c73 +00000000 +02e00593 +00b62023 +00b62023 +00100093 +00009193 +00100e93 +00200e13 +27d19a63 +00100093 +00109193 +00200e93 +00300e13 +27d19063 +00100093 +00709193 +08000e93 +00400e13 +25d19663 +00100093 +00e09193 +00004eb7 +00500e13 +23d19c63 +00100093 +01f09193 +80000eb7 +00600e13 +23d19263 +fff00093 +00009193 +fff00e93 +00700e13 +21d19863 +fff00093 +00109193 +ffe00e93 +00800e13 +1fd19e63 +fff00093 +00709193 +f8000e93 +00900e13 +1fd19463 +fff00093 +00e09193 +ffffceb7 +00a00e13 +1dd19a63 +fff00093 +01f09193 +80000eb7 +00b00e13 +1dd19063 +212120b7 +12108093 +00009193 +21212eb7 +121e8e93 +00c00e13 +1bd19263 +212120b7 +12108093 +00109193 +42424eb7 +242e8e93 +00d00e13 +19d19463 +212120b7 +12108093 +00709193 +90909eb7 +080e8e93 +00e00e13 +17d19663 +212120b7 +12108093 +00e09193 +48484eb7 +00f00e13 +15d19a63 +212120b7 +12108093 +01f09193 +80000eb7 +01000e13 +13d19e63 +00100093 +00709093 +08000e93 +01100e13 +13d09463 +00000213 +00100093 +00709193 +00018313 +00120213 +00200293 +fe5216e3 +08000e93 +01200e13 +11d31063 +00000213 +00100093 +00e09193 +00000013 +00018313 +00120213 +00200293 +fe5214e3 +00004eb7 +01300e13 +0dd31a63 +00000213 +00100093 +01f09193 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +80000eb7 +01400e13 +0bd31263 +00000213 +00100093 +00709193 +00120213 +00200293 +fe5218e3 +08000e93 +01500e13 +09d19063 +00000213 +00100093 +00000013 +00e09193 +00120213 +00200293 +fe5216e3 +00004eb7 +01600e13 +05d19c63 +00000213 +00100093 +00000013 +00000013 +01f09193 +00120213 +00200293 +fe5214e3 +80000eb7 +01700e13 +03d19663 +01f01093 +00000e93 +01800e13 +01d09e63 +02100093 +01409013 +00000e93 +01900e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +fd0f906f +00007537 +ddc50513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +69646e61 +00000000 +02e00593 +00b62023 +00b62023 +ff0100b7 +f0008093 +f0f0f193 +ff010eb7 +f00e8e93 +00200e13 +1bd19463 +0ff010b7 +ff008093 +0f00f193 +0f000e93 +00300e13 +19d19863 +00ff00b7 +0ff08093 +70f0f193 +00f00e93 +00400e13 +17d19c63 +f00ff0b7 +00f08093 +0f00f193 +00000e93 +00500e13 +17d19063 +ff0100b7 +f0008093 +0f00f093 +00000e93 +00600e13 +15d09463 +00000213 +0ff010b7 +ff008093 +70f0f193 +00018313 +00120213 +00200293 +fe5214e3 +70000e93 +00700e13 +11d31e63 +00000213 +00ff00b7 +0ff08093 +0f00f193 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +0f000e93 +00800e13 +0fd31663 +00000213 +f00ff0b7 +00f08093 +f0f0f193 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5210e3 +f00ffeb7 +00fe8e93 +00900e13 +0bd31a63 +00000213 +0ff010b7 +ff008093 +70f0f193 +00120213 +00200293 +fe5216e3 +70000e93 +00a00e13 +09d19663 +00000213 +00ff00b7 +0ff08093 +00000013 +0f00f193 +00120213 +00200293 +fe5214e3 +0f000e93 +00b00e13 +07d19063 +00000213 +f00ff0b7 +00f08093 +00000013 +00000013 +70f0f193 +00120213 +00200293 +fe5212e3 +00f00e93 +00c00e13 +03d19863 +0f007093 +00000e93 +00d00e13 +03d09063 +00ff00b7 +0ff08093 +70f0f013 +00000e93 +00e00e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +d80f906f +00007537 +02050513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0069726f +02e00593 +00b62023 +00b62023 +ff0100b7 +f0008093 +f0f0e193 +f0f00e93 +00200e13 +1dd19463 +0ff010b7 +ff008093 +0f00e193 +0ff01eb7 +ff0e8e93 +00300e13 +1bd19663 +00ff00b7 +0ff08093 +70f0e193 +00ff0eb7 +7ffe8e93 +00400e13 +19d19863 +f00ff0b7 +00f08093 +0f00e193 +f00ffeb7 +0ffe8e93 +00500e13 +17d19a63 +ff0100b7 +f0008093 +0f00e093 +ff010eb7 +ff0e8e93 +00600e13 +15d09c63 +00000213 +0ff010b7 +ff008093 +0f00e193 +00018313 +00120213 +00200293 +fe5214e3 +0ff01eb7 +ff0e8e93 +00700e13 +13d31463 +00000213 +00ff00b7 +0ff08093 +70f0e193 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +00ff0eb7 +7ffe8e93 +00800e13 +0fd31a63 +00000213 +f00ff0b7 +00f08093 +0f00e193 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5210e3 +f00ffeb7 +0ffe8e93 +00900e13 +0bd31e63 +00000213 +0ff010b7 +ff008093 +0f00e193 +00120213 +00200293 +fe5216e3 +0ff01eb7 +ff0e8e93 +00a00e13 +09d19863 +00000213 +00ff00b7 +0ff08093 +00000013 +f0f0e193 +00120213 +00200293 +fe5214e3 +fff00e93 +00b00e13 +07d19263 +00000213 +f00ff0b7 +00f08093 +00000013 +00000013 +0f00e193 +00120213 +00200293 +fe5212e3 +f00ffeb7 +0ffe8e93 +00c00e13 +03d19863 +0f006093 +0f000e93 +00d00e13 +03d09063 +00ff00b7 +0ff08093 +70f0e013 +00000e93 +00e00e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +b18f906f +00007537 +27c50513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +696c7273 +00000000 +02e00593 +00b62023 +00b62023 +ffff80b7 +0000d193 +ffff8eb7 +00200e13 +2bd19263 +ffff80b7 +0010d193 +7fffceb7 +00300e13 +29d19863 +ffff80b7 +0070d193 +02000eb7 +f00e8e93 +00400e13 +27d19c63 +ffff80b7 +00e0d193 +00040eb7 +ffee8e93 +00500e13 +27d19063 +ffff80b7 +00108093 +00f0d193 +00020eb7 +fffe8e93 +00600e13 +25d19263 +fff00093 +0000d193 +fff00e93 +00700e13 +23d19863 +fff00093 +0010d193 +80000eb7 +fffe8e93 +00800e13 +21d19c63 +fff00093 +0070d193 +02000eb7 +fffe8e93 +00900e13 +21d19063 +fff00093 +00e0d193 +00040eb7 +fffe8e93 +00a00e13 +1fd19463 +fff00093 +01f0d193 +00100e93 +00b00e13 +1dd19a63 +212120b7 +12108093 +0000d193 +21212eb7 +121e8e93 +00c00e13 +1bd19c63 +212120b7 +12108093 +0010d193 +10909eb7 +090e8e93 +00d00e13 +19d19e63 +212120b7 +12108093 +0070d193 +00424eb7 +242e8e93 +00e00e13 +19d19063 +212120b7 +12108093 +00e0d193 +00008eb7 +484e8e93 +00f00e13 +17d19263 +212120b7 +12108093 +01f0d193 +00000e93 +01000e13 +15d19663 +ffff80b7 +0010d093 +7fffceb7 +01500e13 +13d09c63 +00000213 +ffff80b7 +0010d193 +00018313 +00120213 +00200293 +fe5216e3 +7fffceb7 +01600e13 +11d31863 +00000213 +ffff80b7 +00e0d193 +00000013 +00018313 +00120213 +00200293 +fe5214e3 +00040eb7 +ffee8e93 +01700e13 +0fd31063 +00000213 +ffff80b7 +00f0d193 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +00020eb7 +fffe8e93 +01800e13 +0bd31663 +00000213 +ffff80b7 +0010d193 +00120213 +00200293 +fe5218e3 +7fffceb7 +01900e13 +09d19463 +00000213 +ffff80b7 +00000013 +00e0d193 +00120213 +00200293 +fe5216e3 +00040eb7 +ffee8e93 +01a00e13 +05d19e63 +00000213 +ffff80b7 +00000013 +00000013 +00f0d193 +00120213 +00200293 +fe5214e3 +00020eb7 +fffe8e93 +01b00e13 +03d19663 +01f05093 +00000e93 +01c00e13 +01d09e63 +02100093 +0140d013 +00000e93 +01d00e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +804f906f +00007537 +5b450513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +006c616a +02e00593 +00b62023 +00b62023 +00200e13 +00000093 +010000ef +00000013 +00000013 +0440006f +00000117 +ff010113 +00410113 +02111a63 +00100113 +014000ef +00110113 +00110113 +00110113 +00110113 +00110113 +00110113 +00300e93 +00300e13 +01d11463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +e25f806f +00007537 +68c50513 +10000637 +00050583 +00058c63 +00b62023 +00150513 +ff1ff06f +706d6973 +0000656c +02e00593 +00b62023 +00b62023 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +f5df806f +00007537 +6e050513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00646461 +02e00593 +00b62023 +00b62023 +00000093 +00000113 +002081b3 +00000e93 +00200e13 +4dd19663 +00100093 +00100113 +002081b3 +00200e93 +00300e13 +4bd19a63 +00300093 +00700113 +002081b3 +00a00e93 +00400e13 +49d19e63 +00000093 +ffff8137 +002081b3 +ffff8eb7 +00500e13 +49d19263 +800000b7 +00000113 +002081b3 +80000eb7 +00600e13 +47d19663 +800000b7 +ffff8137 +002081b3 +7fff8eb7 +00700e13 +45d19a63 +00000093 +00008137 +fff10113 +002081b3 +00008eb7 +fffe8e93 +00800e13 +43d19a63 +800000b7 +fff08093 +00000113 +002081b3 +80000eb7 +fffe8e93 +00900e13 +41d19a63 +800000b7 +fff08093 +00008137 +fff10113 +002081b3 +80008eb7 +ffee8e93 +00a00e13 +3fd19863 +800000b7 +00008137 +fff10113 +002081b3 +80008eb7 +fffe8e93 +00b00e13 +3dd19863 +800000b7 +fff08093 +ffff8137 +002081b3 +7fff8eb7 +fffe8e93 +00c00e13 +3bd19863 +00000093 +fff00113 +002081b3 +fff00e93 +00d00e13 +39d19c63 +fff00093 +00100113 +002081b3 +00000e93 +00e00e13 +39d19063 +fff00093 +fff00113 +002081b3 +ffe00e93 +00f00e13 +37d19463 +00100093 +80000137 +fff10113 +002081b3 +80000eb7 +01000e13 +35d19663 +00d00093 +00b00113 +002080b3 +01800e93 +01100e13 +33d09a63 +00e00093 +00b00113 +00208133 +01900e93 +01200e13 +31d11e63 +00d00093 +001080b3 +01a00e93 +01300e13 +31d09463 +00000213 +00d00093 +00b00113 +002081b3 +00018313 +00120213 +00200293 +fe5214e3 +01800e93 +01400e13 +2dd31e63 +00000213 +00e00093 +00b00113 +002081b3 +00000013 +00018313 +00120213 +00200293 +fe5212e3 +01900e93 +01500e13 +2bd31663 +00000213 +00f00093 +00b00113 +002081b3 +00000013 +00000013 +00018313 +00120213 +00200293 +fe5210e3 +01a00e93 +01600e13 +27d31c63 +00000213 +00d00093 +00b00113 +002081b3 +00120213 +00200293 +fe5216e3 +01800e93 +01700e13 +25d19863 +00000213 +00e00093 +00b00113 +00000013 +002081b3 +00120213 +00200293 +fe5214e3 +01900e93 +01800e13 +23d19263 +00000213 +00f00093 +00b00113 +00000013 +00000013 +002081b3 +00120213 +00200293 +fe5212e3 +01a00e93 +01900e13 +1fd19a63 +00000213 +00d00093 +00000013 +00b00113 +002081b3 +00120213 +00200293 +fe5214e3 +01800e93 +01a00e13 +1dd19463 +00000213 +00e00093 +00000013 +00b00113 +00000013 +002081b3 +00120213 +00200293 +fe5212e3 +01900e93 +01b00e13 +19d19c63 +00000213 +00f00093 +00000013 +00000013 +00b00113 +002081b3 +00120213 +00200293 +fe5212e3 +01a00e93 +01c00e13 +17d19463 +00000213 +00b00113 +00d00093 +002081b3 +00120213 +00200293 +fe5216e3 +01800e93 +01d00e13 +15d19063 +00000213 +00b00113 +00e00093 +00000013 +002081b3 +00120213 +00200293 +fe5214e3 +01900e93 +01e00e13 +11d19a63 +00000213 +00b00113 +00f00093 +00000013 +00000013 +002081b3 +00120213 +00200293 +fe5212e3 +01a00e93 +01f00e13 +0fd19263 +00000213 +00b00113 +00000013 +00d00093 +002081b3 +00120213 +00200293 +fe5214e3 +01800e93 +02000e13 +0bd19c63 +00000213 +00b00113 +00000013 +00e00093 +00000013 +002081b3 +00120213 +00200293 +fe5212e3 +01900e93 +02100e13 +09d19463 +00000213 +00b00113 +00000013 +00000013 +00f00093 +002081b3 +00120213 +00200293 +fe5212e3 +01a00e93 +02200e13 +05d19c63 +00f00093 +00100133 +00f00e93 +02300e13 +05d11263 +02000093 +00008133 +02000e93 +02400e13 +03d11863 +000000b3 +00000e93 +02500e13 +03d09063 +01000093 +01e00113 +00208033 +00000e93 +02600e13 +01d01463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +991f806f +00008537 +c4050513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00006273 +02e00593 +00b62023 +00b62023 +00002097 +81808093 +faa00113 +00208023 +00008183 +faa00e93 +00200e13 +3dd19c63 +00001097 +7f808093 +00000113 +002080a3 +00108183 +00000e93 +00300e13 +3bd19c63 +00001097 +7d808093 +fffff137 +fa010113 +00208123 +00209183 +fffffeb7 +fa0e8e93 +00400e13 +39d19863 +00001097 +7b008093 +00a00113 +002081a3 +00308183 +00a00e93 +00500e13 +37d19863 +00001097 +79708093 +faa00113 +fe208ea3 +ffd08183 +faa00e93 +00600e13 +35d19863 +00001097 +77708093 +00000113 +fe208f23 +ffe08183 +00000e93 +00700e13 +33d19863 +00001097 +75708093 +fa000113 +fe208fa3 +fff08183 +fa000e93 +00800e13 +31d19863 +00001097 +73708093 +00a00113 +00208023 +00008183 +00a00e93 +00900e13 +2fd19863 +00001097 +71808093 +12345137 +67810113 +fe008213 +02220023 +00008183 +07800e93 +00a00e13 +2dd19463 +00001097 +6f008093 +00003137 +09810113 +ffa08093 +002083a3 +00001217 +6d920213 +00020183 +f9800e93 +00b00e13 +29d19c63 +00c00e13 +00000213 +fdd00093 +00001117 +6ac10113 +00110023 +00010183 +fdd00e93 +27d19a63 +00120213 +00200293 +fc521ee3 +00d00e13 +00000213 +fcd00093 +00001117 +67c10113 +00000013 +001100a3 +00110183 +fcd00e93 +25d19063 +00120213 +00200293 +fc521ce3 +00e00e13 +00000213 +fcc00093 +00001117 +64810113 +00000013 +00000013 +00110123 +00210183 +fcc00e93 +21d19463 +00120213 +00200293 +fc521ae3 +00f00e13 +00000213 +fbc00093 +00000013 +00001117 +60c10113 +001101a3 +00310183 +fbc00e93 +1dd19a63 +00120213 +00200293 +fc521ce3 +01000e13 +00000213 +fbb00093 +00000013 +00001117 +5d810113 +00000013 +00110223 +00410183 +fbb00e93 +19d19e63 +00120213 +00200293 +fc521ae3 +01100e13 +00000213 +fab00093 +00000013 +00000013 +00001117 +59c10113 +001102a3 +00510183 +fab00e93 +17d19263 +00120213 +00200293 +fc521ae3 +01200e13 +00000213 +00001117 +57010113 +03300093 +00110023 +00010183 +03300e93 +13d19a63 +00120213 +00200293 +fc521ee3 +01300e13 +00000213 +00001117 +54010113 +02300093 +00000013 +001100a3 +00110183 +02300e93 +11d19063 +00120213 +00200293 +fc521ce3 +01400e13 +00000213 +00001117 +50c10113 +02200093 +00000013 +00000013 +00110123 +00210183 +02200e93 +0dd19463 +00120213 +00200293 +fc521ae3 +01500e13 +00000213 +00001117 +4d410113 +00000013 +01200093 +001101a3 +00310183 +01200e93 +09d19a63 +00120213 +00200293 +fc521ce3 +01600e13 +00000213 +00001117 +4a010113 +00000013 +01100093 +00000013 +00110223 +00410183 +01100e93 +05d19e63 +00120213 +00200293 +fc521ae3 +01700e13 +00000213 +00001117 +46810113 +00000013 +00000013 +00100093 +001102a3 +00510183 +00100e93 +03d19263 +00120213 +00200293 +fc521ae3 +0ef00513 +00001597 +43458593 +00a581a3 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +c98f806f +00008537 +0b450513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00006873 +02e00593 +00b62023 +00b62023 +00001097 +3b008093 +0aa00113 +00209023 +00009183 +0aa00e93 +00200e13 +45d19e63 +00001097 +39008093 +ffffb137 +a0010113 +00209123 +00209183 +ffffbeb7 +a00e8e93 +00300e13 +43d19a63 +00001097 +36808093 +beef1137 +aa010113 +00209223 +0040a183 +beef1eb7 +aa0e8e93 +00400e13 +41d19663 +00001097 +34008093 +ffffa137 +00a10113 +00209323 +00609183 +ffffaeb7 +00ae8e93 +00500e13 +3fd19263 +00001097 +32608093 +0aa00113 +fe209d23 +ffa09183 +0aa00e93 +00600e13 +3dd19263 +00001097 +30608093 +ffffb137 +a0010113 +fe209e23 +ffc09183 +ffffbeb7 +a00e8e93 +00700e13 +39d19e63 +00001097 +2de08093 +00001137 +aa010113 +fe209f23 +ffe09183 +00001eb7 +aa0e8e93 +00800e13 +37d19a63 +00001097 +2b608093 +ffffa137 +00a10113 +00209023 +00009183 +ffffaeb7 +00ae8e93 +00900e13 +35d19663 +00001097 +29008093 +12345137 +67810113 +fe008213 +02221023 +00009183 +00005eb7 +678e8e93 +00a00e13 +33d19063 +00001097 +26408093 +00003137 +09810113 +ffb08093 +002093a3 +00001217 +24e20213 +00021183 +00003eb7 +098e8e93 +00b00e13 +2fd19663 +00c00e13 +00000213 +ffffd0b7 +cdd08093 +00001117 +21010113 +00111023 +00011183 +ffffdeb7 +cdde8e93 +2dd19063 +00120213 +00200293 +fc521ae3 +00d00e13 +00000213 +ffffc0b7 +ccd08093 +00001117 +1d810113 +00000013 +00111123 +00211183 +ffffceb7 +ccde8e93 +29d19263 +00120213 +00200293 +fc5218e3 +00e00e13 +00000213 +ffffc0b7 +bcc08093 +00001117 +19c10113 +00000013 +00000013 +00111223 +00411183 +ffffceb7 +bcce8e93 +25d19263 +00120213 +00200293 +fc5216e3 +00f00e13 +00000213 +ffffb0b7 +bbc08093 +00000013 +00001117 +15810113 +00111323 +00611183 +ffffbeb7 +bbce8e93 +21d19463 +00120213 +00200293 +fc5218e3 +01000e13 +00000213 +ffffb0b7 +abb08093 +00000013 +00001117 +11c10113 +00000013 +00111423 +00811183 +ffffbeb7 +abbe8e93 +1dd19463 +00120213 +00200293 +fc5216e3 +01100e13 +00000213 +ffffe0b7 +aab08093 +00000013 +00000013 +00001117 +0d810113 +00111523 +00a11183 +ffffeeb7 +aabe8e93 +19d19463 +00120213 +00200293 +fc5216e3 +01200e13 +00000213 +00001117 +0a810113 +000020b7 +23308093 +00111023 +00011183 +00002eb7 +233e8e93 +15d19863 +00120213 +00200293 +fc521ae3 +01300e13 +00000213 +00001117 +07010113 +000010b7 +22308093 +00000013 +00111123 +00211183 +00001eb7 +223e8e93 +11d19a63 +00120213 +00200293 +fc5218e3 +01400e13 +00000213 +00001117 +03410113 +000010b7 +12208093 +00000013 +00000013 +00111223 +00411183 +00001eb7 +122e8e93 +0dd19a63 +00120213 +00200293 +fc5216e3 +01500e13 +00000213 +00001117 +ff410113 +00000013 +11200093 +00111323 +00611183 +11200e93 +0bd19063 +00120213 +00200293 +fc521ce3 +01600e13 +00000213 +00001117 +fc010113 +00000013 +01100093 +00000013 +00111423 +00811183 +01100e93 +07d19463 +00120213 +00200293 +fc521ae3 +01700e13 +00000213 +00001117 +f8810113 +00000013 +00000013 +000030b7 +00108093 +00111523 +00a11183 +00003eb7 +001e8e93 +03d19463 +00120213 +00200293 +fc5216e3 +0000c537 +eef50513 +00001597 +f4858593 +00a59323 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +fadf706f +00008537 +5ac50513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +0000006a +02e00593 +00b62023 +00b62023 +00200e13 +0080006f +0340006f +00100093 +0140006f +00108093 +00108093 +00108093 +00108093 +00108093 +00108093 +00300e93 +00300e13 +01d09463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +e3df706f +00008537 +66850513 +10000637 +00050583 +00058a63 +00b62023 +00150513 +ff1ff06f +00656e62 +02e00593 +00b62023 +00b62023 +00200e13 +00000093 +00100113 +00209663 +2bc01a63 +01c01663 +fe209ee3 +2bc01463 +00300e13 +00100093 +00000113 +00209663 +29c01a63 +01c01663 +fe209ee3 +29c01463 +00400e13 +fff00093 +00100113 +00209663 +27c01a63 +01c01663 +fe209ee3 +27c01463 +00500e13 +00100093 +fff00113 +00209663 +25c01a63 +01c01663 +fe209ee3 +25c01463 +00600e13 +00000093 +00000113 +00209463 +01c01463 +23c01863 +fe209ee3 +00700e13 +00100093 +00100113 +00209463 +01c01463 +21c01a63 +fe209ee3 +00800e13 +fff00093 +fff00113 +00209463 +01c01463 +1fc01c63 +fe209ee3 +00900e13 +00000213 +00000093 +00000113 +1e209063 +00120213 +00200293 +fe5216e3 +00a00e13 +00000213 +00000093 +00000113 +00000013 +1a209e63 +00120213 +00200293 +fe5214e3 +00b00e13 +00000213 +00000093 +00000113 +00000013 +00000013 +18209a63 +00120213 +00200293 +fe5212e3 +00c00e13 +00000213 +00000093 +00000013 +00000113 +16209863 +00120213 +00200293 +fe5214e3 +00d00e13 +00000213 +00000093 +00000013 +00000113 +00000013 +14209463 +00120213 +00200293 +fe5212e3 +00e00e13 +00000213 +00000093 +00000013 +00000013 +00000113 +12209063 +00120213 +00200293 +fe5212e3 +00f00e13 +00000213 +00000093 +00000113 +10209063 +00120213 +00200293 +fe5216e3 +01000e13 +00000213 +00000093 +00000113 +00000013 +0c209e63 +00120213 +00200293 +fe5214e3 +01100e13 +00000213 +00000093 +00000113 +00000013 +00000013 +0a209a63 +00120213 +00200293 +fe5212e3 +01200e13 +00000213 +00000093 +00000013 +00000113 +08209863 +00120213 +00200293 +fe5214e3 +01300e13 +00000213 +00000093 +00000013 +00000113 +00000013 +06209463 +00120213 +00200293 +fe5212e3 +01400e13 +00000213 +00000093 +00000013 +00000013 +00000113 +04209063 +00120213 +00200293 +fe5212e3 +00100093 +00009a63 +00108093 +00108093 +00108093 +00108093 +00108093 +00108093 +00300e93 +01500e13 +01d09463 +03c01a63 +10000537 +04500593 +05200613 +04f00693 +00a00713 +00b52023 +00c52023 +00c52023 +00d52023 +00c52023 +00e52023 +00100073 +10000537 +04f00593 +04b00613 +00a00693 +00b52023 +00c52023 +00d52023 +b29f706f +00009537 +9ac50513 10000637 00050583 00058a63 @@ -10057,957 +9032,194 @@ fe5212e3 00b52023 00c52023 00d52023 -f9cf606f -0000a537 -d5050513 +fa0f706f +00009537 +d4c50513 10000637 00050583 00058a63 00b62023 00150513 ff1ff06f -00766964 +00746c62 02e00593 00b62023 00b62023 -01400093 -00600113 -0220c1b3 -00300e93 00200e13 -0dd19463 -fec00093 -00600113 -0220c1b3 -ffd00e93 -00300e13 -0bd19863 -01400093 -ffa00113 -0220c1b3 -ffd00e93 -00400e13 -09d19c63 -fec00093 -ffa00113 -0220c1b3 -00300e93 -00500e13 -09d19063 -800000b7 +00000093 00100113 -0220c1b3 -80000eb7 -00600e13 -07d19463 -800000b7 -fff00113 -0220c1b3 -80000eb7 -00700e13 -05d19863 -800000b7 -00000113 -0220c1b3 -fff00e93 -00800e13 -03d19c63 -00100093 -00000113 -0220c1b3 -fff00e93 -00900e13 -03d19063 -00000093 -00000113 -0220c1b3 -fff00e93 -00a00e13 -01d19463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -fc0f606f -0000a537 -eac50513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -686c756d -00000000 -02e00593 -00b62023 -00b62023 -00000093 -00000113 -022091b3 -00000e93 -00200e13 -4bd19a63 -00100093 -00100113 -022091b3 -00000e93 +0020c663 +2bc01863 +01c01663 +fe20cee3 +2bc01263 00300e13 -49d19e63 -00300093 -00700113 -022091b3 -00000e93 -00400e13 -49d19263 -00000093 -ffff8137 -022091b3 -00000e93 -00500e13 -47d19663 -800000b7 -00000113 -022091b3 -00000e93 -00600e13 -45d19a63 -800000b7 -00000113 -022091b3 -00000e93 -00700e13 -43d19e63 -aaaab0b7 -aab08093 -00030137 -e7d10113 -022091b3 -ffff0eb7 -081e8e93 -01e00e13 -41d19c63 -000300b7 -e7d08093 -aaaab137 -aab10113 -022091b3 -ffff0eb7 -081e8e93 -01f00e13 -3fd19a63 -ff0000b7 -ff000137 -022091b3 -00010eb7 -02000e13 -3dd19e63 -fff00093 -fff00113 -022091b3 -00000e93 -02100e13 -3dd19263 fff00093 00100113 -022091b3 -fff00e93 -02200e13 -3bd19663 +0020c663 +29c01863 +01c01663 +fe20cee3 +29c01263 +00400e13 +ffe00093 +fff00113 +0020c663 +27c01863 +01c01663 +fe20cee3 +27c01263 +00500e13 +00100093 +00000113 +0020c463 +01c01463 +25c01663 +fe20cee3 +00600e13 00100093 fff00113 -022091b3 -fff00e93 -02300e13 -39d19a63 -00d000b7 -00b00137 -022090b3 -00009eb7 -f00e8e93 +0020c463 +01c01463 +23c01863 +fe20cee3 +00700e13 +fff00093 +ffe00113 +0020c463 +01c01463 +21c01a63 +fe20cee3 00800e13 -37d09c63 -00e000b7 -00b00137 -02209133 -0000aeb7 -a00e8e93 +00100093 +ffe00113 +0020c463 +01c01463 +1fc01c63 +fe20cee3 00900e13 -35d11e63 -00d000b7 -021090b3 -0000beb7 -900e8e93 -00a00e13 -35d09263 00000213 -00d000b7 -00b00137 -022091b3 -00018313 +00000093 +fff00113 +1e20c063 +00120213 +00200293 +fe5216e3 +00a00e13 +00000213 +00000093 +fff00113 +00000013 +1a20ce63 00120213 00200293 fe5214e3 -00009eb7 -f00e8e93 00b00e13 -31d31a63 00000213 -00e000b7 -00b00137 -022091b3 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -00c00e13 -2fd31063 -00000213 -00f000b7 -00b00137 -022091b3 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5210e3 -0000aeb7 -500e8e93 -00d00e13 -2bd31463 -00000213 -00d000b7 -00b00137 -022091b3 -00120213 -00200293 -fe5216e3 -00009eb7 -f00e8e93 -00e00e13 -27d19e63 -00000213 -00e000b7 -00b00137 -00000013 -022091b3 -00120213 -00200293 -fe5214e3 -0000aeb7 -a00e8e93 -00f00e13 -25d19663 -00000213 -00f000b7 -00b00137 -00000013 -00000013 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01000e13 -21d19c63 -00000213 -00d000b7 -00000013 -00b00137 -022091b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01100e13 -1fd19463 -00000213 -00e000b7 -00000013 -00b00137 -00000013 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01200e13 -1bd19a63 -00000213 -00f000b7 -00000013 -00000013 -00b00137 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01300e13 -19d19063 -00000213 -00b00137 -00d000b7 -022091b3 -00120213 -00200293 -fe5216e3 -00009eb7 -f00e8e93 -01400e13 -15d19a63 -00000213 -00b00137 -00e000b7 -00000013 -022091b3 -00120213 -00200293 -fe5214e3 -0000aeb7 -a00e8e93 -01500e13 -13d19263 -00000213 -00b00137 -00f000b7 -00000013 -00000013 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01600e13 -0fd19863 -00000213 -00b00137 -00000013 -00d000b7 -022091b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01700e13 -0dd19063 -00000213 -00b00137 -00000013 -00e000b7 -00000013 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01800e13 -09d19663 -00000213 -00b00137 -00000013 -00000013 -00f000b7 -022091b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01900e13 -05d19c63 -7c0000b7 -02101133 -00000e93 -01a00e13 -05d11263 -800000b7 -02009133 -00000e93 -01b00e13 -03d11863 -020010b3 -00000e93 -01c00e13 -03d09063 -021000b7 -02200137 -02209033 -00000e93 -01d00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -a44f606f -0000a537 -3f850513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -686c756d -00007573 -02e00593 -00b62023 -00b62023 00000093 -00000113 -0220a1b3 -00000e93 -00200e13 -4bd19a63 -00100093 -00100113 -0220a1b3 -00000e93 -00300e13 -49d19e63 -00300093 -00700113 -0220a1b3 -00000e93 -00400e13 -49d19263 -00000093 -ffff8137 -0220a1b3 -00000e93 -00500e13 -47d19663 -800000b7 -00000113 -0220a1b3 -00000e93 -00600e13 -45d19a63 -800000b7 -ffff8137 -0220a1b3 -80004eb7 -00700e13 -43d19e63 -aaaab0b7 -aab08093 -00030137 -e7d10113 -0220a1b3 -ffff0eb7 -081e8e93 -01e00e13 -41d19c63 -000300b7 -e7d08093 -aaaab137 -aab10113 -0220a1b3 -00020eb7 -efee8e93 -01f00e13 -3fd19a63 -ff0000b7 -ff000137 -0220a1b3 -ff010eb7 -02000e13 -3dd19e63 -fff00093 fff00113 -0220a1b3 -fff00e93 -02100e13 -3dd19263 -fff00093 -00100113 -0220a1b3 -fff00e93 -02200e13 -3bd19663 -00100093 -fff00113 -0220a1b3 -00000e93 -02300e13 -39d19a63 -00d000b7 -00b00137 -0220a0b3 -00009eb7 -f00e8e93 -00800e13 -37d09c63 -00e000b7 -00b00137 -0220a133 -0000aeb7 -a00e8e93 -00900e13 -35d11e63 -00d000b7 -0210a0b3 -0000beb7 -900e8e93 -00a00e13 -35d09263 -00000213 -00d000b7 -00b00137 -0220a1b3 -00018313 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -00b00e13 -31d31a63 -00000213 -00e000b7 -00b00137 -0220a1b3 00000013 -00018313 +00000013 +1820ca63 00120213 00200293 fe5212e3 -0000aeb7 -a00e8e93 00c00e13 -2fd31063 00000213 -00f000b7 -00b00137 -0220a1b3 +00000093 00000013 -00000013 -00018313 +fff00113 +1620c863 00120213 00200293 -fe5210e3 -0000aeb7 -500e8e93 +fe5214e3 00d00e13 -2bd31463 00000213 -00d000b7 -00b00137 -0220a1b3 +00000093 +00000013 +fff00113 +00000013 +1420c463 00120213 00200293 -fe5216e3 -00009eb7 -f00e8e93 +fe5212e3 00e00e13 -27d19e63 00000213 -00e000b7 -00b00137 +00000093 00000013 -0220a1b3 +00000013 +fff00113 +1220c063 00120213 00200293 -fe5214e3 -0000aeb7 -a00e8e93 +fe5212e3 00f00e13 -25d19663 00000213 -00f000b7 -00b00137 -00000013 -00000013 -0220a1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01000e13 -21d19c63 -00000213 -00d000b7 -00000013 -00b00137 -0220a1b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01100e13 -1fd19463 -00000213 -00e000b7 -00000013 -00b00137 -00000013 -0220a1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01200e13 -1bd19a63 -00000213 -00f000b7 -00000013 -00000013 -00b00137 -0220a1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01300e13 -19d19063 -00000213 -00b00137 -00d000b7 -0220a1b3 +00000093 +fff00113 +1020c063 00120213 00200293 fe5216e3 -00009eb7 -f00e8e93 +01000e13 +00000213 +00000093 +fff00113 +00000013 +0c20ce63 +00120213 +00200293 +fe5214e3 +01100e13 +00000213 +00000093 +fff00113 +00000013 +00000013 +0a20ca63 +00120213 +00200293 +fe5212e3 +01200e13 +00000213 +00000093 +00000013 +fff00113 +0820c863 +00120213 +00200293 +fe5214e3 +01300e13 +00000213 +00000093 +00000013 +fff00113 +00000013 +0620c463 +00120213 +00200293 +fe5212e3 01400e13 -15d19a63 00000213 -00b00137 -00e000b7 -00000013 -0220a1b3 -00120213 -00200293 -fe5214e3 -0000aeb7 -a00e8e93 -01500e13 -13d19263 -00000213 -00b00137 -00f000b7 +00000093 00000013 00000013 -0220a1b3 +fff00113 +0420c063 00120213 00200293 fe5212e3 -0000aeb7 -500e8e93 -01600e13 -0fd19863 -00000213 -00b00137 -00000013 -00d000b7 -0220a1b3 -00120213 -00200293 -fe5214e3 -00009eb7 -f00e8e93 -01700e13 -0dd19063 -00000213 -00b00137 -00000013 -00e000b7 -00000013 -0220a1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -a00e8e93 -01800e13 -09d19663 -00000213 -00b00137 -00000013 -00000013 -00f000b7 -0220a1b3 -00120213 -00200293 -fe5212e3 -0000aeb7 -500e8e93 -01900e13 -05d19c63 -7c0000b7 -02102133 -00000e93 -01a00e13 -05d11263 -800000b7 -0200a133 -00000e93 -01b00e13 -03d11863 -020020b3 -00000e93 -01c00e13 -03d09063 -021000b7 -02200137 -0220a033 -00000e93 -01d00e13 -01d01463 -03c01a63 -10000537 -04500593 -05200613 -04f00693 -00a00713 -00b52023 -00c52023 -00c52023 -00d52023 -00c52023 -00e52023 -00100073 -10000537 -04f00593 -04b00613 -00a00693 -00b52023 -00c52023 -00d52023 -d05f506f -0000b537 -94450513 -10000637 -00050583 -00058c63 -00b62023 -00150513 -ff1ff06f -696c7273 -00000000 -02e00593 -00b62023 -00b62023 -ffff80b7 -0000d193 -ffff8eb7 -00200e13 -2bd19263 -ffff80b7 -0010d193 -7fffceb7 -00300e13 -29d19863 -ffff80b7 -0070d193 -02000eb7 -f00e8e93 -00400e13 -27d19c63 -ffff80b7 -00e0d193 -00040eb7 -ffee8e93 -00500e13 -27d19063 -ffff80b7 +00100093 +00104a63 00108093 -00f0d193 -00020eb7 -fffe8e93 -00600e13 -25d19263 -fff00093 -0000d193 -fff00e93 -00700e13 -23d19863 -fff00093 -0010d193 -80000eb7 -fffe8e93 -00800e13 -21d19c63 -fff00093 -0070d193 -02000eb7 -fffe8e93 -00900e13 -21d19063 -fff00093 -00e0d193 -00040eb7 -fffe8e93 -00a00e13 -1fd19463 -fff00093 -01f0d193 -00100e93 -00b00e13 -1dd19a63 -212120b7 -12108093 -0000d193 -21212eb7 -121e8e93 -00c00e13 -1bd19c63 -212120b7 -12108093 -0010d193 -10909eb7 -090e8e93 -00d00e13 -19d19e63 -212120b7 -12108093 -0070d193 -00424eb7 -242e8e93 -00e00e13 -19d19063 -212120b7 -12108093 -00e0d193 -00008eb7 -484e8e93 -00f00e13 -17d19263 -212120b7 -12108093 -01f0d193 -00000e93 -01000e13 -15d19663 -ffff80b7 -0010d093 -7fffceb7 +00108093 +00108093 +00108093 +00108093 +00108093 +00300e93 01500e13 -13d09c63 -00000213 -ffff80b7 -0010d193 -00018313 -00120213 -00200293 -fe5216e3 -7fffceb7 -01600e13 -11d31863 -00000213 -ffff80b7 -00e0d193 -00000013 -00018313 -00120213 -00200293 -fe5214e3 -00040eb7 -ffee8e93 -01700e13 -0fd31063 -00000213 -ffff80b7 -00f0d193 -00000013 -00000013 -00018313 -00120213 -00200293 -fe5212e3 -00020eb7 -fffe8e93 -01800e13 -0bd31663 -00000213 -ffff80b7 -0010d193 -00120213 -00200293 -fe5218e3 -7fffceb7 -01900e13 -09d19463 -00000213 -ffff80b7 -00000013 -00e0d193 -00120213 -00200293 -fe5216e3 -00040eb7 -ffee8e93 -01a00e13 -05d19e63 -00000213 -ffff80b7 -00000013 -00000013 -00f0d193 -00120213 -00200293 -fe5214e3 -00020eb7 -fffe8e93 -01b00e13 -03d19663 -01f05093 -00000e93 -01c00e13 -01d09e63 -02100093 -0140d013 -00000e93 -01d00e13 -01d01463 +01d09463 03c01a63 10000537 04500593 @@ -11028,7 +9240,7 @@ fffe8e93 00b52023 00c52023 00d52023 -93df506f +c54f706f 00050613 00000513 0015f693 @@ -11245,11 +9457,9 @@ f61ff0ef 00005b20 64726168 00202020 -00002020 74666f73 00202020 -4f525245 -000a2152 +00002020 12b9b0a1 6c637943 6f632065 @@ -11286,14 +9496,1804 @@ f00ff00f 0ff000ff ff0000ff f00f0ff0 -beefbeef -beefbeef -beefbeef -beefbeef -beefbeef efefefef efefefef 0000efef +beefbeef +beefbeef +beefbeef +beefbeef +beefbeef +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 0 0 0 diff --git a/picorv32_firmware/Makefile b/picorv32_firmware/Makefile new file mode 100644 index 0000000..db0a301 --- /dev/null +++ b/picorv32_firmware/Makefile @@ -0,0 +1,179 @@ + +RISCV_GNU_TOOLCHAIN_GIT_REVISION = c3ad555 +RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX = /opt/riscv32 + +SHELL = bash +TEST_OBJS = $(addsuffix .o,$(basename $(wildcard tests/*.S))) +FIRMWARE_OBJS = firmware/start.o firmware/irq.o firmware/print.o firmware/sieve.o firmware/multest.o firmware/stats.o +GCC_WARNS = -Werror -Wall -Wextra -Wshadow -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings +GCC_WARNS += -Wredundant-decls -Wstrict-prototypes -Wmissing-prototypes -pedantic # -Wconversion +TOOLCHAIN_PREFIX = $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)i/bin/riscv32-unknown-elf- + +# Add things like "export http_proxy=... https_proxy=..." here +GIT_ENV = true + +test: testbench.vvp firmware/firmware.hex + vvp -N $< + +test_vcd: testbench.vvp firmware/firmware.hex + vvp -N $< +vcd +trace +noerror + +test_rvf: testbench_rvf.vvp firmware/firmware.hex + vvp -N $< +vcd +trace +noerror + +test_wb: testbench_wb.vvp firmware/firmware.hex + vvp -N $< + +test_wb_vcd: testbench_wb.vvp firmware/firmware.hex + vvp -N $< +vcd +trace +noerror + +test_ez: testbench_ez.vvp + vvp -N $< + +test_ez_vcd: testbench_ez.vvp + vvp -N $< +vcd + +test_sp: testbench_sp.vvp firmware/firmware.hex + vvp -N $< + +test_axi: testbench.vvp firmware/firmware.hex + vvp -N $< +axi_test + +test_synth: testbench_synth.vvp firmware/firmware.hex + vvp -N $< + +test_verilator: testbench_verilator firmware/firmware.hex + ./testbench_verilator + +testbench.vvp: testbench.v picorv32.v + iverilog -o $@ $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) $^ + chmod -x $@ + +testbench_rvf.vvp: testbench.v picorv32.v rvfimon.v + iverilog -o $@ -D RISCV_FORMAL $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) $^ + chmod -x $@ + +testbench_wb.vvp: testbench_wb.v picorv32.v + iverilog -o $@ $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) $^ + chmod -x $@ + +testbench_ez.vvp: testbench_ez.v picorv32.v + iverilog -o $@ $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) $^ + chmod -x $@ + +testbench_sp.vvp: testbench.v picorv32.v + iverilog -o $@ $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) -DSP_TEST $^ + chmod -x $@ + +testbench_synth.vvp: testbench.v synth.v + iverilog -o $@ -DSYNTH_TEST $^ + chmod -x $@ + +testbench_verilator: testbench.v picorv32.v + verilator --cc --exe -Wno-lint -trace --top-module picorv32_wrapper testbench.v picorv32.v testbench.cc \ + $(subst C,-DCOMPRESSED_ISA,$(COMPRESSED_ISA)) --Mdir testbench_verilator_dir + $(MAKE) -C testbench_verilator_dir -f Vpicorv32_wrapper.mk + cp testbench_verilator_dir/Vpicorv32_wrapper testbench_verilator + +check: check-yices + +check-%: check.smt2 + yosys-smtbmc -s $(subst check-,,$@) -t 30 --dump-vcd check.vcd check.smt2 + yosys-smtbmc -s $(subst check-,,$@) -t 25 --dump-vcd check.vcd -i check.smt2 + +check.smt2: picorv32.v + yosys -v2 -p 'read_verilog -formal picorv32.v' \ + -p 'prep -top picorv32 -nordff' \ + -p 'assertpmux -noinit; opt -fast' \ + -p 'write_smt2 -wires check.smt2' + +synth.v: picorv32.v scripts/yosys/synth_sim.ys + yosys -qv3 -l synth.log scripts/yosys/synth_sim.ys + +firmware/firmware.hex: firmware/firmware.bin firmware/makehex.py + python3 firmware/makehex.py $< 16384 > $@ + +firmware/firmware.bin: firmware/firmware.elf + $(TOOLCHAIN_PREFIX)objcopy -O binary $< $@ + chmod -x $@ + +firmware/firmware.elf: $(FIRMWARE_OBJS) $(TEST_OBJS) firmware/sections.lds + $(TOOLCHAIN_PREFIX)gcc -Os -ffreestanding -nostdlib -o $@ \ + -Wl,-Bstatic,-T,firmware/sections.lds,-Map,firmware/firmware.map,--strip-debug \ + $(FIRMWARE_OBJS) $(TEST_OBJS) -lgcc + chmod -x $@ + +firmware/start.o: firmware/start.S + $(TOOLCHAIN_PREFIX)gcc -c -march=rv32i$(subst C,c,$(COMPRESSED_ISA)) -o $@ $< + +firmware/%.o: firmware/%.c + $(TOOLCHAIN_PREFIX)gcc -c -march=rv32i$(subst C,c,$(COMPRESSED_ISA)) -Os --std=c99 $(GCC_WARNS) -ffreestanding -nostdlib -o $@ $< + +tests/%.o: tests/%.S tests/riscv_test.h tests/test_macros.h + $(TOOLCHAIN_PREFIX)gcc -c -march=rv32i -o $@ -DTEST_FUNC_NAME=$(notdir $(basename $<)) \ + -DTEST_FUNC_TXT='"$(notdir $(basename $<))"' -DTEST_FUNC_RET=$(notdir $(basename $<))_ret $< + +download-tools: + sudo bash -c 'set -ex; mkdir -p /var/cache/distfiles; $(GIT_ENV); \ + $(foreach REPO,riscv-gnu-toolchain riscv-binutils-gdb riscv-dejagnu riscv-gcc riscv-glibc riscv-newlib riscv-qemu, \ + if ! test -d /var/cache/distfiles/$(REPO).git; then rm -rf /var/cache/distfiles/$(REPO).git.part; \ + git clone --bare https://github.com/riscv/$(REPO) /var/cache/distfiles/$(REPO).git.part; \ + mv /var/cache/distfiles/$(REPO).git.part /var/cache/distfiles/$(REPO).git; else \ + (cd /var/cache/distfiles/$(REPO).git; git fetch https://github.com/riscv/$(REPO)); fi;)' + +define build_tools_template +build-$(1)-tools: + @read -p "This will remove all existing data from $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)$(subst riscv32,,$(1)). Type YES to continue: " reply && [[ "$$$$reply" == [Yy][Ee][Ss] || "$$$$reply" == [Yy] ]] + sudo bash -c "set -ex; rm -rf $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)$(subst riscv32,,$(1)); mkdir -p $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)$(subst riscv32,,$(1)); chown $$$${USER}: $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)$(subst riscv32,,$(1))" + +$(MAKE) build-$(1)-tools-bh + +build-$(1)-tools-bh: + +set -ex; $(GIT_ENV); \ + if [ -d /var/cache/distfiles/riscv-gnu-toolchain.git ]; then reference_riscv_gnu_toolchain="--reference /var/cache/distfiles/riscv-gnu-toolchain.git"; else reference_riscv_gnu_toolchain=""; fi; \ + if [ -d /var/cache/distfiles/riscv-binutils-gdb.git ]; then reference_riscv_binutils_gdb="--reference /var/cache/distfiles/riscv-binutils-gdb.git"; else reference_riscv_binutils_gdb=""; fi; \ + if [ -d /var/cache/distfiles/riscv-dejagnu.git ]; then reference_riscv_dejagnu="--reference /var/cache/distfiles/riscv-dejagnu.git"; else reference_riscv_dejagnu=""; fi; \ + if [ -d /var/cache/distfiles/riscv-gcc.git ]; then reference_riscv_gcc="--reference /var/cache/distfiles/riscv-gcc.git"; else reference_riscv_gcc=""; fi; \ + if [ -d /var/cache/distfiles/riscv-glibc.git ]; then reference_riscv_glibc="--reference /var/cache/distfiles/riscv-glibc.git"; else reference_riscv_glibc=""; fi; \ + if [ -d /var/cache/distfiles/riscv-newlib.git ]; then reference_riscv_newlib="--reference /var/cache/distfiles/riscv-newlib.git"; else reference_riscv_newlib=""; fi; \ + if [ -d /var/cache/distfiles/riscv-qemu.git ]; then reference_riscv_qemu="--reference /var/cache/distfiles/riscv-qemu.git"; else reference_riscv_qemu=""; fi; \ + rm -rf riscv-gnu-toolchain-$(1); git clone $$$$reference_riscv_gnu_toolchain https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-$(1); \ + cd riscv-gnu-toolchain-$(1); git checkout $(RISCV_GNU_TOOLCHAIN_GIT_REVISION); \ + git submodule update --init $$$$reference_riscv_binutils_gdb riscv-binutils; \ + git submodule update --init $$$$reference_riscv_binutils_gdb riscv-gdb; \ + git submodule update --init $$$$reference_riscv_dejagnu riscv-dejagnu; \ + git submodule update --init $$$$reference_riscv_gcc riscv-gcc; \ + git submodule update --init $$$$reference_riscv_glibc riscv-glibc; \ + git submodule update --init $$$$reference_riscv_newlib riscv-newlib; \ + git submodule update --init $$$$reference_riscv_qemu riscv-qemu; \ + mkdir build; cd build; ../configure --with-arch=$(2) --prefix=$(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)$(subst riscv32,,$(1)); make + +.PHONY: build-$(1)-tools +endef + +$(eval $(call build_tools_template,riscv32i,rv32i)) +$(eval $(call build_tools_template,riscv32ic,rv32ic)) +$(eval $(call build_tools_template,riscv32im,rv32im)) +$(eval $(call build_tools_template,riscv32imc,rv32imc)) + +build-tools: + @echo "This will remove all existing data from $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)i, $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)ic, $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)im, and $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX)imc." + @read -p "Type YES to continue: " reply && [[ "$$reply" == [Yy][Ee][Ss] || "$$reply" == [Yy] ]] + sudo bash -c "set -ex; rm -rf $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX){i,ic,im,imc}; mkdir -p $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX){i,ic,im,imc}; chown $${USER}: $(RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX){i,ic,im,imc}" + +$(MAKE) build-riscv32i-tools-bh + +$(MAKE) build-riscv32ic-tools-bh + +$(MAKE) build-riscv32im-tools-bh + +$(MAKE) build-riscv32imc-tools-bh + +toc: + gawk '/^-+$$/ { y=tolower(x); gsub("[^a-z0-9]+", "-", y); gsub("-$$", "", y); printf("- [%s](#%s)\n", x, y); } { x=$$0; }' README.md + +clean: + rm -rf riscv-gnu-toolchain-riscv32i riscv-gnu-toolchain-riscv32ic \ + riscv-gnu-toolchain-riscv32im riscv-gnu-toolchain-riscv32imc + rm -vrf $(FIRMWARE_OBJS) $(TEST_OBJS) check.smt2 check.vcd synth.v synth.log \ + firmware/firmware.elf firmware/firmware.bin firmware/firmware.hex firmware/firmware.map \ + testbench.vvp testbench_sp.vvp testbench_synth.vvp testbench_ez.vvp \ + testbench_rvf.vvp testbench_wb.vvp testbench.vcd testbench.trace \ + testbench_verilator testbench_verilator_dir + +.PHONY: test test_vcd test_sp test_axi test_wb test_wb_vcd test_ez test_ez_vcd test_synth download-tools build-tools toc clean diff --git a/picorv32_firmware/firmware/firmware.bin b/picorv32_firmware/firmware/firmware.bin deleted file mode 100644 index e7d75de7046953b55beab7f8609d987f7205dc4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45184 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 jrAxao(>VHQ-+xE#Kc)U31Mhh- diff --git a/picorv32_firmware/firmware/firmware.elf b/picorv32_firmware/firmware/firmware.elf index 31397adf5fdb8b455c2c65151796dc61b556c9b5..75e55694736e358d425c89f7903fa9e85e82c4b5 100644 GIT binary patch literal 62724 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%0A+L_BeCdM9Y6mdv}a- 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 a!u;w!l*12~E0S;Y3H+NfnqvOr`2Ig##izdj literal 73968 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 diff --git a/picorv32_firmware/firmware/start.S b/picorv32_firmware/firmware/start.S index 06d4744..82399ba 100644 --- a/picorv32_firmware/firmware/start.S +++ b/picorv32_firmware/firmware/start.S @@ -8,7 +8,7 @@ #define ENABLE_QREGS #define ENABLE_RVTST #define ENABLE_SIEVE -#define ENABLE_MULTST +//#define ENABLE_MULTST #define ENABLE_STATS #ifndef ENABLE_QREGS @@ -430,15 +430,15 @@ start: TEST(or) TEST(and) - TEST(mulh) - TEST(mulhsu) - TEST(mulhu) - TEST(mul) +// TEST(mulh) +// TEST(mulhsu) +// TEST(mulhu) +// TEST(mul) - TEST(div) - TEST(divu) - TEST(rem) - TEST(remu) +// TEST(div) +// TEST(divu) +// TEST(rem) +// TEST(remu) TEST(simple) @@ -489,19 +489,19 @@ start: /* Hard mul functions for multest.c **********************************/ -hard_mul: - mul a0, a0, a1 - ret - -hard_mulh: - mulh a0, a0, a1 - ret - -hard_mulhsu: - mulhsu a0, a0, a1 - ret - -hard_mulhu: - mulhu a0, a0, a1 - ret +//hard_mul: +// mul a0, a0, a1 +// ret +// +//hard_mulh: +// mulh a0, a0, a1 +// ret +// +//hard_mulhsu: +// mulhsu a0, a0, a1 +// ret +// +//hard_mulhu: +// mulhu a0, a0, a1 +// ret diff --git a/picorv32_firmware/firmware/start.o b/picorv32_firmware/firmware/start.o deleted file mode 100644 index 557a6ec80e1723e4452e425e63f283eddde01907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5308 zcmeH~U2Ggz701uc?0DVU6kF3mXn@^jntoxDptMa;OW2AO8Z|)Zch#cJZg%9|Fm~LX z*(9JyY}q2ArVh;mzMoBoY+21bs|W5$&;sb8ndLqFzeHUBld$ zrQW`+)U$(V19y$1Z-R`ywnO;NAOqQJ4E#%B? zC1-vN{c46YxzBK>#tmnB!Ek0;hBJHKaORc_XTD=N<77FL0~W?x7;j;`h4B`~TNrO) zd_$380JKl_J+Ae zeK?Q$M2pNxO4KK_3G+}bQ9sm5m{Vlbr?Q55xMtK3w+wTd%=&cJG>_EG`jM7t&QP*G zlTDgOYsvc2R??g$t3I2x%wsjHeynAgbJSCx%l4SZYd!VjtsZlpQuX<4$~;j^)lali zds{dbT(3T&BrfA;?XxTJf4c$=?AgY1)8J>vKt|XmGQ!5)*+AHMo*Mj2^&lf`EENre z-HVK{Z$L)aHzFf!+}I6--H(j0KZlI4Z$d`cpGW4P+J?R*x^YJ*_m<@5Y02$VlG6(3 z{v_+olakwulG6(3{wV9sKS*x>UUFLD+=8q(Pe^XhOHM1CJ1*%*7t#il}*|` zon)hDDQTy+Bpa!5axy0o?;_que1P~TzY8*_-hVFD_~ny-Vc(|#T5Fv&hHFG?Z;A5C zDBmaYr#+13f4xbGO#G?M#IlaZNonC)Pak%>C1?=tvTlzAeFsrI^Iw7fmE!+K^Y=r)s`zhe{vqgb#h=ss1?V}&Kdt#^pie9QJDPtM`W?kTulX0C z&nx~V&Ho$pCB^?p^RGgGsQA}4|KHHp6#oaB|1Z8*uqJck>u+@L9r6FMp!*fSU-Ji` zmnnWxOcl*XbQ9hKw=4cKZTxcRHHyDN^H)MYsQ5#gzZ&`x#lK(kAAo*B@i%JzCg`n- z|Cr`K4ecrZh8J()`QNpD6yHHUB;6US++x zqWK-@n-zbvc7I-npHcj$G(Um+cS!LIn%@t9z2bjI^S=OpqvC%RI&QrFt$^O5`1ff3 zYUt+`f4$~E2whVAjhep+I#B$_H2+!Xn&MN%_1z%1)7?gXkgo((uDlQ`&J}mq4-2ri z{e+49vb)ozk*XKCen6#srI>^0LP?Tem0ab?1E0KVnFA9Cl&_Y@wux=1x6^i!^B!%_ zdofp7R67pV#>Y=l?I zv&u)~ibdXmaH=?%YIHQ7#}h=e1-#pku|wWzG!yz%qCS;8Pa4*77 z%-E%{SFya45HVL-h#nPp1h>ve=pa{FL|3jnGUmCsQ8t#C(h3eav4Je2|%cjG@giFBiPX{1w41=Ct5*%(n@?$m|Hd%)C-? zhxtyypD^DoxEIGe$QKmtX6CO8&M>bQJjDDB!Rwi$6W+*tpQvwPUMKi@=5GovF+U(U zVE&fi8uPaWzry^G-~-IjLO8|zu&6IE^AAY0Gt8R=pJjej@CD}Y3tnRWq2Mdb{9_aC zI`iX#lUTb3pAPlR&EEFd6DO~%Kzy|kS`zy6_HCZRa`H>DsXoPw5pg7^0cbp`(n`l zw#}eh0)gFyEz8^J*RQ0?~!p2g_a=3(9A`wyoA BlXMf?>Po9^X_O!+eF$W?lSsuh4aq)4 zEp$UgL~B``Af+u5)Q75l2&7uUJ_M{#(1%@OL9h=C)h9((+6TeX_?>(2OwK0lgE!3F z@B8M=H)qcMna#=PdtR_Ci=t-HZCYSN`%?N!hw8Rc3oWB;k|>=_Qns0#Q|N>Dle9VW z4YW0MyuN9^Ffc%2vSzc!M~HjVFrAsmPzb+tDnr4?)fYo@pgTs-KyRnuT=h^$?a)Vz zJ_S8T!6(&&?310CpJ$&dXXfYAsa^^`svf*TREqqsq<~X-_TSICh(DQ5jj;do+J|%c z+jtR$XYRqT#Mk%oePO9SFFp13GGBi#x}KeA@F<06{({F81!t?z>Sr&$&d-?U>w6YF z;`ceJpE1kVcj=ndReoU#xuhx-T&Q-3#Cb(EgMX?O&Ul(-~3)HJGNE5|2yCN~atvI9KsQswv%9<5h;9v4Y2{F2~Q59K=pRYqx^Qikr4k zyT}Le=~EV^?Nt=o8M?Ll<$KyUhx_Mt=veJN!?8q-@vAtVpVw;zYv;D<_`1$9ieG$> z!}oALc`MjB_vDg%qFmNSxr|t-@8dET&O_xB#j3nHkCKJ?wOQt&a$X#-^5z`Ms9$wc zoCD{|^_{@GHh6Qbr%=D@qj4T4c1bRAO{Oi3|GGFAj=!IOoXafxKg{u*gBm-TM_iAJ zh555)A+Dx;m*&j%sPX%?F2rJNOdbvKaSnB^-$PM6$1ceuo+D)A{Z=%_-Y1v19*&Lo zTQ1|Zf4#BZaV{D5Ph$O$kM)B!#rusNtYVF9A8Q$Vla0N`4j!o{W;j>1SM}OKxspJP zm9}b@uht4`n#$Y3YSeE1Yy$hC6DE6`(#@G<*j#T)FPp-?_ce|m%yGl?ztb46M-`8_ z=IN%eS;pSL{@MQ}9{s?UXxN>J68MuXK}{+m6N?tD1m;6Gi`D^bi729<0B#q22e5-Z zUN?(8fCCXld^d1j@Eq{C;QN8gg1-cOQSeuQX9e#At_dD6wj#lzHvqQ?J_f!|@VCJS z1V06SLhuj3Ck4k?(j~#qgI^c?Gw_<=UxEK4IM0ohSXa7P^c_H#;NOEE75qo=3xdyq zUlaUS@Vel)z%vP)RI}(0^gV*#20tPAzu=byPaxNy1z*9rH{nnX`!jgE;2XgE1m6sP zTJUY)R|WUMD}wI=|4s0{;CBQ+1fCP~sTbT4@B1qFZo&J&hXg+YJ|*~3@auvPgWnOn z2);$U|6Aa_f|tNcg1-wsE%=AvzX;BAr%AledGHRwKLyVV{snkh@M-X_QtuCa5CpJ)6$e7^T-#M=Pn~^r?oj7Wb>6AYS#|DG=WcaIh1AXZZdc## z>ibb0b*+>5_brb8(ZQk`*7fmN6ZvMKS=wN9?jqd*cA9n2Ms%%aUF>7MMeDpDMwp)v z;nMZwh=@;0)$mg)CNCd4z=!Y3U zrS$=!pJr@6MrVb7nX#+mXN6v4%pWMUKZWjK{W_-T8yTD0?q;n2nV|zhA7b38ea3}; zf$>hQUljT^##yabgkERdrS-c)&tMWb{NY5~&e-JB!}w{f9~Sxv#=Ersp3pBb-mUd- zh5nPkHG%5_w_vVC&t1uwKlEsQz^%_{Ol@Ot9xE1(pf8T<{%C|o2ZsvSs(51>C=?6S zb_9#7S;F871t*n=DQcud^bkH?eq-GhVuc>ONN5qSa9I}ol$Cg2flT@>fw_oSJ^d|Mp% EA31z(R{#J2 literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/addi.S b/picorv32_firmware/tests/addi.S new file mode 100644 index 0000000..f7a418b --- /dev/null +++ b/picorv32_firmware/tests/addi.S @@ -0,0 +1,71 @@ +# See LICENSE for license details. + +#***************************************************************************** +# addi.S +#----------------------------------------------------------------------------- +# +# Test addi instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, addi, 0x00000000, 0x00000000, 0x000 ); + TEST_IMM_OP( 3, addi, 0x00000002, 0x00000001, 0x001 ); + TEST_IMM_OP( 4, addi, 0x0000000a, 0x00000003, 0x007 ); + + TEST_IMM_OP( 5, addi, 0xfffff800, 0x00000000, 0x800 ); + TEST_IMM_OP( 6, addi, 0x80000000, 0x80000000, 0x000 ); + TEST_IMM_OP( 7, addi, 0x7ffff800, 0x80000000, 0x800 ); + + TEST_IMM_OP( 8, addi, 0x000007ff, 0x00000000, 0x7ff ); + TEST_IMM_OP( 9, addi, 0x7fffffff, 0x7fffffff, 0x000 ); + TEST_IMM_OP( 10, addi, 0x800007fe, 0x7fffffff, 0x7ff ); + + TEST_IMM_OP( 11, addi, 0x800007ff, 0x80000000, 0x7ff ); + TEST_IMM_OP( 12, addi, 0x7ffff7ff, 0x7fffffff, 0x800 ); + + TEST_IMM_OP( 13, addi, 0xffffffff, 0x00000000, 0xfff ); + TEST_IMM_OP( 14, addi, 0x00000000, 0xffffffff, 0x001 ); + TEST_IMM_OP( 15, addi, 0xfffffffe, 0xffffffff, 0xfff ); + + TEST_IMM_OP( 16, addi, 0x80000000, 0x7fffffff, 0x001 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 17, addi, 24, 13, 11 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 18, 0, addi, 24, 13, 11 ); + TEST_IMM_DEST_BYPASS( 19, 1, addi, 23, 13, 10 ); + TEST_IMM_DEST_BYPASS( 20, 2, addi, 22, 13, 9 ); + + TEST_IMM_SRC1_BYPASS( 21, 0, addi, 24, 13, 11 ); + TEST_IMM_SRC1_BYPASS( 22, 1, addi, 23, 13, 10 ); + TEST_IMM_SRC1_BYPASS( 23, 2, addi, 22, 13, 9 ); + + TEST_IMM_ZEROSRC1( 24, addi, 32, 32 ); + TEST_IMM_ZERODEST( 25, addi, 33, 50 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/addi.o b/picorv32_firmware/tests/addi.o new file mode 100644 index 0000000000000000000000000000000000000000..c41d99d0944256ae8593da1a6a0b3d90c15d2e38 GIT binary patch literal 2600 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 M5J{V(W4FleKRiTP=>Px# literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/andi.S b/picorv32_firmware/tests/andi.S new file mode 100644 index 0000000..c2ae94d --- /dev/null +++ b/picorv32_firmware/tests/andi.S @@ -0,0 +1,55 @@ +# See LICENSE for license details. + +#***************************************************************************** +# andi.S +#----------------------------------------------------------------------------- +# +# Test andi instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Logical tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, andi, 0xff00ff00, 0xff00ff00, 0xf0f ); + TEST_IMM_OP( 3, andi, 0x000000f0, 0x0ff00ff0, 0x0f0 ); + TEST_IMM_OP( 4, andi, 0x0000000f, 0x00ff00ff, 0x70f ); + TEST_IMM_OP( 5, andi, 0x00000000, 0xf00ff00f, 0x0f0 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 6, andi, 0x00000000, 0xff00ff00, 0x0f0 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 7, 0, andi, 0x00000700, 0x0ff00ff0, 0x70f ); + TEST_IMM_DEST_BYPASS( 8, 1, andi, 0x000000f0, 0x00ff00ff, 0x0f0 ); + TEST_IMM_DEST_BYPASS( 9, 2, andi, 0xf00ff00f, 0xf00ff00f, 0xf0f ); + + TEST_IMM_SRC1_BYPASS( 10, 0, andi, 0x00000700, 0x0ff00ff0, 0x70f ); + TEST_IMM_SRC1_BYPASS( 11, 1, andi, 0x000000f0, 0x00ff00ff, 0x0f0 ); + TEST_IMM_SRC1_BYPASS( 12, 2, andi, 0x0000000f, 0xf00ff00f, 0x70f ); + + TEST_IMM_ZEROSRC1( 13, andi, 0, 0x0f0 ); + TEST_IMM_ZERODEST( 14, andi, 0x00ff00ff, 0x70f ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/andi.o b/picorv32_firmware/tests/andi.o new file mode 100644 index 0000000000000000000000000000000000000000..b72885d703d8bce4e766ecf97799adb130de0404 GIT binary patch literal 2004 zcmb7EO-Ni<6#m})sYKp9ebF?UHUkO4MKU=4*4-@9pM?|&6uJnQ@i{?>F@rM;O9K_$ z6k0@h5?r{Dthy-0McZk2Qd-C&3&jSq=t2nHb#WzG2F-WweRsS`$RcOB_k7=X&zyVi z&%57#GWn_Jd9dc;IZhd{kuxJB+6|x`Z5Yo2VK$5L9D-H)=!YyW6@H`EgL~@YNo8?% zUc%$-VM=sqO?W5q3RHZgRMRJ3^Ht~<5N+)DHv^UD*hzeZeC#71`h$oz_s=(Rf_Q~v zN2(V43ZY*{w6%Y(sq%_Cl6dM%=7F&nxT`OMKF8jDE`%VcRy(^;fpPllCO>|DldR?g--w8|ly_SCwHpYe`ExCejE*R@L=TgtFP5_Y2gHXC-y#m2|34)E+~Gfx*Bt&c`If^^b2AU~|G{x< zfq-J8T5n7*R_<0&tSyP3UaT%RT4eU#Vih`O2)8Tq3kDAxH)7nVabw1f8~3qs6ULPW z6JJXFP~wwJr4iIB^*V}^rBq4xL%JW<{fO>Ibw39EZb>)2RBa@S>C4zv0mBItsXx)h zSzXp0B=6+~;x4|EVv}q^yM~x`@O=kwIQSw6;Jo0}T zlea_O2;ug%S$1+!Zsog5EXVn-ILRR<-c2F-4k=2#azA8VxicMXHWwkj;=rE*60`Zb P$lbVGOjNQ#^fvAlMwKkT literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/auipc.S b/picorv32_firmware/tests/auipc.S new file mode 100644 index 0000000..c67e3c9 --- /dev/null +++ b/picorv32_firmware/tests/auipc.S @@ -0,0 +1,39 @@ +# See LICENSE for license details. + +#***************************************************************************** +# auipc.S +#----------------------------------------------------------------------------- +# +# Test auipc instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + TEST_CASE(2, a0, 10000, \ + .align 3; \ + lla a0, 1f + 10000; \ + jal a1, 1f; \ + 1: sub a0, a0, a1; \ + ) + + TEST_CASE(3, a0, -10000, \ + .align 3; \ + lla a0, 1f - 10000; \ + jal a1, 1f; \ + 1: sub a0, a0, a1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/auipc.o b/picorv32_firmware/tests/auipc.o new file mode 100644 index 0000000000000000000000000000000000000000..bb91f0f9b7ceec844195401c72eda92ee7f187c9 GIT binary patch literal 1268 zcmb7DO=}ZT6upzlOygIaFlu5eI3U!5?a(Ab6-2U7K`7`#!G(}claUtMG$tcN5G=SA zUE~k=6S}avb>q&3n}ACG(_f;z_E9&fUuo-K=(m`!)~MM;)`+Mrlh^oiA8B@@+{iiN^xDfQNJ(YYBg8Ix*RB2lk_>L zwb_f4^sw3d;h}X6nVQpi29xKkuECk(ca~4#-d9sh4e>3+iXJ+#spT9^EoV?ZBQpLm znGjP$yoOjQVu7u}O|1v)xmaMA;3d3YS_59f9cYi>UO_==Bb3meHh`P_E8>&PihP5Y z*q9dfUv4MSI%3jG7smxP8_D literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/beq.S b/picorv32_firmware/tests/beq.S new file mode 100644 index 0000000..c972eff --- /dev/null +++ b/picorv32_firmware/tests/beq.S @@ -0,0 +1,73 @@ +# See LICENSE for license details. + +#***************************************************************************** +# beq.S +#----------------------------------------------------------------------------- +# +# Test beq instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Branch tests + #------------------------------------------------------------- + + # Each test checks both forward and backward branches + + TEST_BR2_OP_TAKEN( 2, beq, 0, 0 ); + TEST_BR2_OP_TAKEN( 3, beq, 1, 1 ); + TEST_BR2_OP_TAKEN( 4, beq, -1, -1 ); + + TEST_BR2_OP_NOTTAKEN( 5, beq, 0, 1 ); + TEST_BR2_OP_NOTTAKEN( 6, beq, 1, 0 ); + TEST_BR2_OP_NOTTAKEN( 7, beq, -1, 1 ); + TEST_BR2_OP_NOTTAKEN( 8, beq, 1, -1 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_BR2_SRC12_BYPASS( 9, 0, 0, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 10, 0, 1, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 11, 0, 2, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 12, 1, 0, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 13, 1, 1, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 14, 2, 0, beq, 0, -1 ); + + TEST_BR2_SRC12_BYPASS( 15, 0, 0, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 16, 0, 1, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 17, 0, 2, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 18, 1, 0, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 19, 1, 1, beq, 0, -1 ); + TEST_BR2_SRC12_BYPASS( 20, 2, 0, beq, 0, -1 ); + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 21, x1, 3, \ + li x1, 1; \ + beq x0, x0, 1f; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ +1: addi x1, x1, 1; \ + addi x1, x1, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/beq.o b/picorv32_firmware/tests/beq.o new file mode 100644 index 0000000000000000000000000000000000000000..372102c5d8f6e7acbcde17a7ba2f286ad710150b GIT binary patch literal 3416 zcmb7`O-x)>6vxkd%nXQxJQyTMvAh;4Aa&#o-<8Ffpt2y^7pjV4Y~ zqNHsalIfy}E=Y7iq6-o~(xhEXA|@`3VPO+uSWMDty69q}E?kh}|J;wqq3FU(?!CYN zIsbRw+&A~#;iH!)UvV6VY;)*OI#5I{bviSkrf#aCY8s9b#iLOgj*)j6bLL8vI{fbt zdx|bp+V^L(?^7{ab~&cv^*$AGeH?`|AN!PPDfMQWOU}LP{-aD|sW)EVhrEZpXY)NG z-xIG-Az#^#JC%KNeV530#p}i#=UK>rPQHwOQx>4uC;VR z=L+UJ+|ypyR%+L|HHy1r?umTCKOT1*sp$H2ulWt!bNx_0jmm;i9MS~Jj!>) zZwY;k>?xm+LVp0gCiG?K zTS8xjE(=|RCb7OxAv=Zs9C}jdFQJ!&{u=tG(6^yWLVpkKS7A`iQEQ*Dk{tROET88u z(BmTiD|lY$GFU$E-=XJ3{vmi(=s&>n`}iArMdTlWzYsctXR{%6Ep$m}4|+@JX6Rj^ z+n~!rpM>Un>gG^4^q!Sie*(G&-R1|t?6LX`cv9$>ziK<^0s3AAk<)_3)gMkbNZ=JL~v>GN4iEG_dqy_mh2 z55?St#VjdLlHN_fx1hOSPXl@y)YFijhV?X}r%^oxeP#~KoHVnk6qr(hsTG)FfvFal za)GIrH1(1JEv0igN=zo*0As%z12rbyq>AtuC{DWlD#Bx+IB*BRNi_!Upkf{acStdh zfjg|2$G{y?sFXH5D=fv%1fsi3Zg^(dulU^PnVDp(8u+krm4oXzWRt2JW3 zHKKll96Dy=JlVJh_F~%9hN%Jn<8T{8_nuKmDdrl@Wr}dEsh%xpJ(24+Oxylt9h5%e1kV?g^0-Qyo1G(JPDe~;OC z_&l<4K6|_byNUQ5vGEl13pzd};`7XXI?nI0^ pZFK&;FQRije)pe1x3z#YUXA|`Z4qdT4UhTmKS^Y^6<-$m{sE12q459! literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/bge.S b/picorv32_firmware/tests/bge.S new file mode 100644 index 0000000..d6aea7c --- /dev/null +++ b/picorv32_firmware/tests/bge.S @@ -0,0 +1,76 @@ +# See LICENSE for license details. + +#***************************************************************************** +# bge.S +#----------------------------------------------------------------------------- +# +# Test bge instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Branch tests + #------------------------------------------------------------- + + # Each test checks both forward and backward branches + + TEST_BR2_OP_TAKEN( 2, bge, 0, 0 ); + TEST_BR2_OP_TAKEN( 3, bge, 1, 1 ); + TEST_BR2_OP_TAKEN( 4, bge, -1, -1 ); + TEST_BR2_OP_TAKEN( 5, bge, 1, 0 ); + TEST_BR2_OP_TAKEN( 6, bge, 1, -1 ); + TEST_BR2_OP_TAKEN( 7, bge, -1, -2 ); + + TEST_BR2_OP_NOTTAKEN( 8, bge, 0, 1 ); + TEST_BR2_OP_NOTTAKEN( 9, bge, -1, 1 ); + TEST_BR2_OP_NOTTAKEN( 10, bge, -2, -1 ); + TEST_BR2_OP_NOTTAKEN( 11, bge, -2, 1 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_BR2_SRC12_BYPASS( 12, 0, 0, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 13, 0, 1, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 14, 0, 2, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 15, 1, 0, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 16, 1, 1, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 17, 2, 0, bge, -1, 0 ); + + TEST_BR2_SRC12_BYPASS( 18, 0, 0, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 19, 0, 1, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 20, 0, 2, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 21, 1, 0, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 22, 1, 1, bge, -1, 0 ); + TEST_BR2_SRC12_BYPASS( 23, 2, 0, bge, -1, 0 ); + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 24, x1, 3, \ + li x1, 1; \ + bge x1, x0, 1f; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ +1: addi x1, x1, 1; \ + addi x1, x1, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/bge.o b/picorv32_firmware/tests/bge.o new file mode 100644 index 0000000000000000000000000000000000000000..a66735abf8f560cfae932d7c8dcbe1451a50dcc5 GIT binary patch literal 3968 zcmb7{O>9(E6vywI&J2|_lSf}|YH8#FMT*EU@3qi^RYwKvqA?Sqi3?&oOh>EoF=;1J zBhe;cLX<_5VWli;WYI(to2YEWWD?Pk(8WZHK~ypcU|6u2s0$Vb{GWU7eLVxZ@HY3J z|L>f0&)oNM?@Zs@J-Wwn9A%rM{#47PR5rzt0d4wJt6HH36H0lBgc?jL_b6=PgM?b| zpM~#1b-1zS?*3Pcs*ROI1n3$N?Q(eQcs`6sW)WtQ` z{D-|*yQ;)|b**zRKC{*o_pr9YRlhsR>7bnYeK|Vsir*FGwNqYWInO?$%YJ8+qiZQA zT93)mwU+#jC{NdNoAYeFn%~}>=P&2cJ5lr9D6X$B(-b$?*B0gIHD&M1G1s>;%F}Dg zE$7+wT=rX|99?Vtz8rIX$tX|PDmCZXdNn^T^XOeJT*333asR#JeaAcH6i(KhLU*+V z`^l{&a&a%|Co0KC+*>h+ee)Iiccx!5_J*29ZO%ttav@$x%G^uXe`DWcS^wEuns&ER zE%=kIMa6Z7A2}V>22GutqaK3jwTSFTpfiHEKejtYrId`$f}e-3 z34Rf}A$T8jTXbkSssQd2{04ZJ;A!x<;CH|?f{%hv3;qziD7XS{2>uw{h5gFSQJ+F& z1%Cz}7yJeInBcF$X9Rx>t_i*fzAgAiu-}3~H%I*fJ0rLb9?>xx9Q8ZKoZwr~y9ECM zJt_D$bV=|X=n27bT>EjsE5WmZUGOo%o#1)FJ>Uhw>%gZ4)3duEI1R1|9sr*gyc2v= za2DJUya#+;@FD=VQjnh&=_bP#0H^5JqEEM zt!WHmJG7<|YshHO21Lt);nf7Z1l$hoELE6kcMS2ta z=Y;<>=||Z=PkJ-!Go;PjbEF?*e^vO;lcq0Ivn!cQ=Vb8ke!O+=gbLd>OIbEdr9|1*YxVw#~`XZmsNt;9Gw7Z>ihDZ;x zrnA%5&x)KJ=^@T}fi(S4K%=wN=F>T9bLgD4{v)J!a{fu-pCkP^`_Bpg1=7RpuM7Vz z(oe9z6=$HW-$D9G_Gg5DnDkTZ&k6rN(pmPGg@1cX1Zmb@q_n&Hi4}dsvT%oKezi*nbLo)d*{qo__maIlmvaJjHg>s;T0EJdSZX zv?ucAyh`uK!S_F!k6heZWwyJb*Juu(ZCl)k)v%(REN*WHHi&7&IB$l{hpjq+wugw{*HN2wm2R}Y}uT99f2#c$XmU@KSMlh=m- Lqs@tt6oJzBI;90sM=jVzV;X`9i$+?e)v5)Wc8nN} zPC`wZ*agXSr7SSAAd$o-Ry0wQiDE(mi$+U=(dZ=jhXsoX5<&=}e&?QhAE&k~yyV{V z{m%XFdAD!gyEDAEyL*r4dE}Z$|Ij@mI+~K1j0sItOUtOenkZdeP3<-0A4AMdR@3_6 zEOHOhk;>ZngRcy}!S-TxIl*}|mkOweTpGo5Hv`Jmm)dfxO5T;b!QEU#sWqKy!Mu-o z-_5tG`7oWzV!kq;_A2vseW>QQrBgk2eO!N=n%|mE_1X1hw|=Xd-<(d3*!g(#5*x57LQxDkcKDvT`r3J-f)0#y)e`gGXXtJ^RW_`i%EZusZho z?5!;DvIqOCEz5#~$-{w=D9Q z>)s4fvCr%=yQI%}D?wfCHGAw?;8pvpjeVwO-;zFi{hHWoYK|=O#&s(}QhWLN&)p^} z7W}0<-Vr>9UT$jE%dIX|;XU+=)ji2{O;BB|sU*|OPU2nr0{sWuFWLAfjiI*q;j5WW z7HhQk65iY2zr)9T-&VEYR3NItKi#S*X&gbE^r#M+yEKm;hG=pK_hZm`Pnme`+#o>Kfg^o-&cpyw372z^6wFSH*Yb{^%xTNJ+z?ovDk9#Z@^ zcvA5(@QmUQz-7fna4p_vX&!w9kx~2!xKHt?;Bm#DgU=}b8hlyt_uzXUi$@oLTdFw8 z&7+?%?pOQ^_$$R_a5uU%kN$$#=Md|!L3b&>4n3^+7Ia?mUFadjN!*J`#mm7{iutpc zP`nC!MsWjpM)5lEX~j+8i;A1UbBZ(I^NM$ZuPM%gZz$dazN)wzT#GKvqrK2|iuXe| zDt-x?_vHKo(0mQYuR(Vz9)a#t{3bN7asGFq+2iZ6(LYsu`651tnNZ27EY_T!4F|yHC3T>&- z)(UO0&{hj=xzN^&Y`w_Vi)_8f){8PU(mysv&D~KV#Mo-a(2P+cG8rC2qoYKt$?zB& z9VId*!((W4lxQ;<9z&y}#CDV6F*G_%v_nT`3=OE16>%q+a3f5RD!2`XTFLxCPcLi!p@7z>`~%AKj>=E4 z-YNc5DnHHo3CYi@{I9HcN&c3~Cvgt?PfEU#wY^s@te=v6kIMJ5ep>Q*l`pW)O8$h( zpJx4xcg zL{szFTZi)f2NCn55{H}`9USh*G0unfK!3iUnh)aO`yVZU7q^-0>u!E8UdFXuOIoo8 zk#*Mc_;R8We0((UdY-F8=hu|km8f$CkmKf%Un~9y@8{zh+&JP^$BpY9N9X(1eL2(6g*V)L zf8ROZJ8$lr`|jl9SI1xTJda%S=x^FoL|v_t88FiUYN2KtOc7;LDH=?Ze-U%>(-iFq zzDMjCI#=)AI8~}pHC0P+%*5LQs^a>L=Tq_LfQntwp<-v`-Mtk&Dz-<5GHrdx*EdxD zpvoW2wB?bnAz$CH*Y8*P{h7822w*lW3=EBA~mSZ{eOx4fzaw#alsl?CD_7^(`Lb z`z7d#eeLXvHhu1Xt3hY%F}2pVcucL8pds}}|BjlTM(PuAzhd9yz9^!n}k zT4Rs-O#T*+UEj9YXFgM~>2sfFHE4-FrdHn;k6m9n_L*AwMxUz}1xfAWy;6MLr|SF@ zI`$*>lvljE<`ui6ChT{=nwm&v(m|@4t|v3iOW4=nq5ow2Z9D%#Wz-fweCg}SYFc}5 zC@1oN|&KaN`DBwsPskX8%ke> zt|?uGCbhoLAonW$1@ySmUqR0*{SEXrrGJ2ql>QMqXu@EcXVyOEBzbfTte@v^(4#8< zJ9tLv8dyK?KcS~o{sDMF>A%4G`}i07lFB~m_2yWsmuzXxtn-_I2E zVWm$)zpeBf^m(N(Krbmh4}C}JPoQ1%vA)X<8kuZmx?Gt&TR1aK+1WXsC(llwuf$^N z+}UX|o*cbj_@E@*FVlcbM`SuG)1XX4G7ZZV_SreKbI#7TQfNzswpM71g|=E~%Z0XH z&eqF?G+QW_DLbA^gc$qH7@9Gc$e9R_q2XMj-$Zx}4Tp&VaL$Zj;)r1$!^Ba;Jcfxu z!#swGAu|q}5v$@*$alshHwvXXR%C)w4eK#VYG5@+NfoSx|Ls7ZoSUx5x7D3=-x^WB zMGoz-ah_b<2m5I;^((3}y@zru0r;q%OYK|FVu4+*a`+s{yAww^lkVGL;hp!@s-gvMux^FL&^9zKs; zoX;LV%Wfh*M_fG5{F1~^sQ3(XpTzk+cK$2Op~RO}{99)J0YqC<@pWdqIqE9@kaJP(+ABtC-Q zr|l!clr3L4Qz@LnT$z)3#?jn#set2)538v{r9jzJI0*hn3*f~gA^YkOKbm~}+er9t zMcNKb%z2S?2m7QIK7P&kdd{_?^R{K}N>m&m#?95^t-@Q)r62ck4Q@Q+vBZsiYv}xW lUqE^3yCTpIw?F2)_cW2+R(x6P`w!7yu517R literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/bltu.S b/picorv32_firmware/tests/bltu.S new file mode 100644 index 0000000..5dcfe7e --- /dev/null +++ b/picorv32_firmware/tests/bltu.S @@ -0,0 +1,73 @@ +# See LICENSE for license details. + +#***************************************************************************** +# bltu.S +#----------------------------------------------------------------------------- +# +# Test bltu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Branch tests + #------------------------------------------------------------- + + # Each test checks both forward and backward branches + + TEST_BR2_OP_TAKEN( 2, bltu, 0x00000000, 0x00000001 ); + TEST_BR2_OP_TAKEN( 3, bltu, 0xfffffffe, 0xffffffff ); + TEST_BR2_OP_TAKEN( 4, bltu, 0x00000000, 0xffffffff ); + + TEST_BR2_OP_NOTTAKEN( 5, bltu, 0x00000001, 0x00000000 ); + TEST_BR2_OP_NOTTAKEN( 6, bltu, 0xffffffff, 0xfffffffe ); + TEST_BR2_OP_NOTTAKEN( 7, bltu, 0xffffffff, 0x00000000 ); + TEST_BR2_OP_NOTTAKEN( 8, bltu, 0x80000000, 0x7fffffff ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_BR2_SRC12_BYPASS( 9, 0, 0, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 10, 0, 1, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 11, 0, 2, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 12, 1, 0, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 13, 1, 1, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 14, 2, 0, bltu, 0xf0000000, 0xefffffff ); + + TEST_BR2_SRC12_BYPASS( 15, 0, 0, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 16, 0, 1, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 17, 0, 2, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 18, 1, 0, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 19, 1, 1, bltu, 0xf0000000, 0xefffffff ); + TEST_BR2_SRC12_BYPASS( 20, 2, 0, bltu, 0xf0000000, 0xefffffff ); + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 21, x1, 3, \ + li x1, 1; \ + bltu x0, x1, 1f; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ +1: addi x1, x1, 1; \ + addi x1, x1, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/bltu.o b/picorv32_firmware/tests/bltu.o new file mode 100644 index 0000000000000000000000000000000000000000..28c9f61a35739f4b5bdf3515985ede3c5ed20ddd GIT binary patch literal 3476 zcmb7GO=w(I6h3b$0*Ss-k8rx@++QcN&yvffbwTlQ#R1kC#u#13Q1Vmlf#efmAD3V1AA_WH(2dp#4=g(uu| zzVDpxo%??7y_pYQ9C^vIEb`5wzv&?(8mrfpUKQG?j%q0tA#x%SN=3=OhL~B5P>cHw za!=6Z%JKb)>HK>vFGk8C&Z}C?r6O{UWm9I`rA$NVbf&Rn-TT9RkZCS;Ik9fk%lnR1 z**EnrQSWeKL+1LR-XZGkPHYr)8~uqgTj(DzSsA<3&i$R(1=K3&UEU9B4W(1MHfw6) zx_IfNt`+E8qC(1|f@A&p@Y;B(Mc0?e2@z{5&{ULW+jX5#0~JFq-HX45xtIT=aqu28 zzq-c)T?6Y@57jB{uGPCvuO4zAg#$Nau;|DYD znD`sz&|B-Fi>`)?QK`Lyef7&aKJ_E5rfSy`)!1-X;Bw^ThP{`B={JYlvy;0m^X~|L%`Pse;IgH@K=Cu3;sIrj^O8k>w?3`q6~Pa z;1|Ki1kZsN1b-iVMeu9jn}UA~PT0TNEOoxL3jP@iBZ7YcJ}>x};LC!41%6xb@4)X1 z{yq4cHE_x-;tx7v7{9L{f#v($1RoalpMj?ZF9XZ>y$wDk>bt;;g8v09zsG&>1yO$h zydroQ@9L)DkAtrXZiBB2-Uwb6ycv8;@Dt#8Ok)}I zRUDN>KAX#r&!jJ9DKR_8aeO8_pAX37<(VugO_JVDzca0Ij}E;$^y$#ALrRAM9R_vq zx=r*XqXS#W&ooD(bO~0f^v*}!p5+liw2j8Q-r+hM$R2lZ3!pTsN z%CPqo_CmeDN#(szpTg|DP`|?Ly--SF_FiZ}`9bCJRGjj7W&}Nvr@P~cR8n`t^C+f! z;As@oUGOaG=L);=xoohVn!^5L# z1=XImk7+!@`QsXoGB%nEj9oa`B!-`#V*Cte^;uw_(0CTX*Ay7H==_HwzreUv=lNW) zPinlx*vz}km=Au~4GjB~g6drGHGC%cnp=$9w5G(kUE?*zrsq0iqxp&Pb6Rtkafilb z#zw!z*l75SvOD2mdl)wV6Jq1NX7qf9_!>TQ{5+p8c0$X~iTo(z(>gyZ@>dym>-?u8 ze}l27^J^l%!I=LE!YU%a$Ji{6IL-(Eeq6@AT7OpLhZ*oK^n4wKC?#3(Er^Ijb=xa#t?p(-VmKIUT2bG?$%D z;|SveYcicrQ(^*#!T&H9TD&SUTSxuYn8)0{g$+20$au)`_+$9p0v&HNzMgCK7`$wm z`z>zz068|lA1^0fI)3?}j(f0i#On%-bsHFbzt3ZEKN|zL6Z8V4tF=U*_)Wllc;tZ2 N#Z8-K#g_%Te*qb|%x3@q literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/bne.S b/picorv32_firmware/tests/bne.S new file mode 100644 index 0000000..0b33753 --- /dev/null +++ b/picorv32_firmware/tests/bne.S @@ -0,0 +1,73 @@ +# See LICENSE for license details. + +#***************************************************************************** +# bne.S +#----------------------------------------------------------------------------- +# +# Test bne instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Branch tests + #------------------------------------------------------------- + + # Each test checks both forward and backward branches + + TEST_BR2_OP_TAKEN( 2, bne, 0, 1 ); + TEST_BR2_OP_TAKEN( 3, bne, 1, 0 ); + TEST_BR2_OP_TAKEN( 4, bne, -1, 1 ); + TEST_BR2_OP_TAKEN( 5, bne, 1, -1 ); + + TEST_BR2_OP_NOTTAKEN( 6, bne, 0, 0 ); + TEST_BR2_OP_NOTTAKEN( 7, bne, 1, 1 ); + TEST_BR2_OP_NOTTAKEN( 8, bne, -1, -1 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_BR2_SRC12_BYPASS( 9, 0, 0, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 10, 0, 1, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 11, 0, 2, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 12, 1, 0, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 13, 1, 1, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 14, 2, 0, bne, 0, 0 ); + + TEST_BR2_SRC12_BYPASS( 15, 0, 0, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 16, 0, 1, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 17, 0, 2, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 18, 1, 0, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 19, 1, 1, bne, 0, 0 ); + TEST_BR2_SRC12_BYPASS( 20, 2, 0, bne, 0, 0 ); + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 21, x1, 3, \ + li x1, 1; \ + bne x1, x0, 1f; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ +1: addi x1, x1, 1; \ + addi x1, x1, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/bne.o b/picorv32_firmware/tests/bne.o new file mode 100644 index 0000000000000000000000000000000000000000..cc45986290ff1aea86c9958a54cee0eea7e894b7 GIT binary patch literal 3456 zcmb7`PiP!f9LImN+11$? zh=m3kq-cee4H9c80dpwWLqIKpJuDa@2az6H5b0r|Q9R_ZXbv8v@%wx4&E%Ix55Dl; z`+R@D@BC)o%-fk}!}aABL#S zxr^Adbh+BPH#L`~Qm7K(n2JXoD&hE;WmD!;hceCOo=juedVI@yl4&US#G(o0ZRE+z zcZ+;?ESf^Tx+jkB6#33rbleyoiyi1{biiLp=@QE%58l9STtvj#kG04 z=JE-hTQuiIT`$*CZq>OW#R9Znx9A*?1?s63aOiR48>qW>ARoi}Gq;>(-_yXJjYA&g zyXiFfzIyhR_kHRF-gr>@D__j%W|;?(&bRV#7GW7Ze;eX3UKpwFvUbb`{y`z>=5 z&u`KG_l`Y@ePv~q?_1cfHQ4iZDKs98g`H3-Tn)x**RZ$0LI1(@hi3kj@~Ex-@P#*m zrLgoq^LvIS* z2)!kA3v@;3lhE5jcR~LxbR1f3QWdkP4?4mzqfdiR37rCu3w;*6AoMx#s?g`bn?hd% z?+Bd%N5u1b8#*EMyU-Ve=5t*U`YQCg&>uiQ68d9kui04WCkHe#@j^CVn3zjn%2GTx z&-27wcA?;l>C5;^Do>K$Ousd&xmQnpdg|BHfSv~RG^D3tJ-G=pyJk+B*;H~(Dc96; zO)=M0b4@wd)JvLrNtbfze4gTC$$*QoSBM>jC2m`67-q{d-2Vr?99`TUsl>0EsdtV;#CCUUwE7NwLff+exSiufNA z^ojXw!Fy)SL63-f4RYw1iSy*eZLl5IrWQ;`@&6CEGwAm73Ms{0r+I|=xaLvjR?TC~ z#>4MJ+tKk!W)q)gKB40?%qKO^G8@ko<~AK)6!9hIb{)UY+@bjfvpIH^nLh?-Yv^8l zow*YO+HG{ZOCjB1Hpkv$?$+@#^NX4{nT=ix4e>z4 zE6nX_bwIEQ-j&Hq} ze%i-1xbckJ;y3nH(D{1LpmRNb4?KhJ)dJFmTB6UqBG4WleaaWXMVsx$hxxvL04)8E A`2YX_ literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/div.S.ignore b/picorv32_firmware/tests/div.S.ignore new file mode 100644 index 0000000..24dc9ff --- /dev/null +++ b/picorv32_firmware/tests/div.S.ignore @@ -0,0 +1,41 @@ +# See LICENSE for license details. + +#***************************************************************************** +# div.S +#----------------------------------------------------------------------------- +# +# Test div instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, div, 3, 20, 6 ); + TEST_RR_OP( 3, div, -3, -20, 6 ); + TEST_RR_OP( 4, div, -3, 20, -6 ); + TEST_RR_OP( 5, div, 3, -20, -6 ); + + TEST_RR_OP( 6, div, -1<<31, -1<<31, 1 ); + TEST_RR_OP( 7, div, -1<<31, -1<<31, -1 ); + + TEST_RR_OP( 8, div, -1, -1<<31, 0 ); + TEST_RR_OP( 9, div, -1, 1, 0 ); + TEST_RR_OP(10, div, -1, 0, 0 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/divu.S.ignore b/picorv32_firmware/tests/divu.S.ignore new file mode 100644 index 0000000..cd348c9 --- /dev/null +++ b/picorv32_firmware/tests/divu.S.ignore @@ -0,0 +1,41 @@ +# See LICENSE for license details. + +#***************************************************************************** +# divu.S +#----------------------------------------------------------------------------- +# +# Test divu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, divu, 3, 20, 6 ); + TEST_RR_OP( 3, divu, 715827879, -20, 6 ); + TEST_RR_OP( 4, divu, 0, 20, -6 ); + TEST_RR_OP( 5, divu, 0, -20, -6 ); + + TEST_RR_OP( 6, divu, -1<<31, -1<<31, 1 ); + TEST_RR_OP( 7, divu, 0, -1<<31, -1 ); + + TEST_RR_OP( 8, divu, -1, -1<<31, 0 ); + TEST_RR_OP( 9, divu, -1, 1, 0 ); + TEST_RR_OP(10, divu, -1, 0, 0 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/j.S b/picorv32_firmware/tests/j.S new file mode 100644 index 0000000..259a236 --- /dev/null +++ b/picorv32_firmware/tests/j.S @@ -0,0 +1,49 @@ +# See LICENSE for license details. + +#***************************************************************************** +# j.S +#----------------------------------------------------------------------------- +# +# Test j instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Test basic + #------------------------------------------------------------- + + li TESTNUM, 2; + j test_2; + j fail; +test_2: + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 3, x1, 3, \ + li x1, 1; \ + j 1f; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ + addi x1, x1, 1; \ +1: addi x1, x1, 1; \ + addi x1, x1, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/j.o b/picorv32_firmware/tests/j.o new file mode 100644 index 0000000000000000000000000000000000000000..28de446d136ce6176ad06f4ff8109e45a35dae8c GIT binary patch literal 1056 zcmb7DJ#Q015Pj?WaQKSOvM5L*aS{kozzHWv0SO@&kje!Gy>+n<1xh`zX#No!L%m1D!&+Gj9q%$D-j8*ayP<- zzW4x5dhg&w^_ISQJS!@L7k)F0gEE}?&H6{y{6zn5{M6tN8M@k2-tEIL z+vi2-o$DO%_;byJUn$~wQsFAOxHg3wB)4ry^&RpjPJEwy=)|jktv_ab=&U~_f9b@} z<{a!+VdGrPAStrE=#J9u49U(!ush1$6!V}z9%ZOBt9X^Z9%{aZoixvpbXv6*1{icF zSy5G9^3M)fGgMN`CNE&~5qT79(F&o#IT4fDY1AuYSX*B=< literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/jal.S b/picorv32_firmware/tests/jal.S new file mode 100644 index 0000000..742abac --- /dev/null +++ b/picorv32_firmware/tests/jal.S @@ -0,0 +1,60 @@ +# See LICENSE for license details. + +#***************************************************************************** +# jal.S +#----------------------------------------------------------------------------- +# +# Test jal instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Test 2: Basic test + #------------------------------------------------------------- + +test_2: + li TESTNUM, 2 + li ra, 0 + +linkaddr_2: + jal target_2 + nop + nop + + j fail + +target_2: + la x2, linkaddr_2 + addi x2, x2, 4 + bne x2, ra, fail + + #------------------------------------------------------------- + # Test delay slot instructions not executed nor bypassed + #------------------------------------------------------------- + + TEST_CASE( 3, x2, 3, \ + li x2, 1; \ + jal 1f; \ + addi x2, x2, 1; \ + addi x2, x2, 1; \ + addi x2, x2, 1; \ + addi x2, x2, 1; \ +1: addi x2, x2, 1; \ + addi x2, x2, 1; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/jal.o b/picorv32_firmware/tests/jal.o new file mode 100644 index 0000000000000000000000000000000000000000..7e511c2b48ad1b1b7e91bbac1c4d77b9d6456450 GIT binary patch literal 1224 zcmb7DO=}ZT6g@AQnO3QBhEb|*!2v~FXh>S2E>qCrB7#Uk7fN_drW#F?Fqws}6m${X z&L8k6xKUiXapy*`;7&KLE&2oW+?jdt73sno?%Z?EJMUv|-aNh5-c(A#gu*ZUWx%vr zj9kvk1n;$wF4jHx&sn=KU7U^HQag#!{+Zto^#Gasts+{k*CJ$`{{v7VtKlWW2o?3j9_>RSI5WlndEn<8AZSt`-es6}s?kMO3oTQ${le9C` zyD{qHL~3UkKTc<)HyXysJ*yb>hmUlxmvmN<>g0Z$671;ypcr4nSWhOXw;K^3%}Nt; zNtm4^PR+JUjzPd$2}N2ibty)d_gb7UOoENxCO&nn&;=XaC-%KUUttM&hb5%P!I2!| zs^Fsq-eU1fd{^{Zp+B?q7lO+__%m@Jn@H3rPj*wi&6*}fePB=$4>a2s_QK?LN$B srb*>ivykQ&99uMZw@97jwz@}I0Q5pPIWsw(Y}H8LbK84*8|k(sP`KOonyW@KC85wvyEUf%Nd zRM_g!9%o*-)Kx84ka$caKyx4K{WI){4-ZFMYPsw5_c&@&zg7Ce&y|$_I{fivM~?Tj zzb(DB^;=^jey%3Ii+(BeNTtv(CH2kyVc(sQ*e%G*$-{5_-0Uh3*HXTz{?NcTLEn)N zd;{-fKQr)phu_5FS-;_rw{g$IJ%42I{&EXa|LLhypX#TuXI`9{P5aqGCeALW{h_156WE7Y~ha(#R zb{Goxc3^!5C_1tW^EZSl9NB}sKVhuz1FjAZk|PJe8&>@gaL?l30!J1Pffp@)0{DT& z+rUpPeirzDi(dq8SnGcezSpXg+xJi2vg%iWZ(E%8s}{co{HMiPU$S@%ylipS|FZZ^ z;7#w{pL!_D-6NI(W6xyq!=~3(cFA^rYXgR4)ff6^IS9_ zjrM#~lxJF^uyec_%}q<|l{z%Guj;g0r#(8&$U@ldO7UQ+ zfN9z-t9e?@70hL~s%GkCmwMT)i28_dn(H)^gE5s}`B9YwQrej4Oh)Ik4%TQBvC(V5 zd0*?qM(0@whP6&?^zVT4lUgS>I?qZls&!(cF97G)X`R^Ue3rp_trHvlN8o&*bz-A0 z0S9@l6C3?k;5=VW1hLV17J@0N`dk?OIe31fl7-mlJZr%wtrHtP4V?c{>%>O)AbDA> z^RjXL4`9qt!n5Pb}D?GxfHm=OPB82vSI0TW^;?#<{W z;t8$yfXBCLEXD5mGf{XHIqK+q!k|vG72=iP3(yFoP>M%!L_Z@6@M0-RwnTj!7bzr> z97*BU6W0>`0Z7#q;r7wa+9<~Mgqtt*Z&ojql#h8Q29NcpeC9G{EHeo9D?#A>eucqx e`Am7_O)o%s1@b#V5~klcxb1t6MrC6{HokYsw$}v! literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/lb.S b/picorv32_firmware/tests/lb.S new file mode 100644 index 0000000..eaf7902 --- /dev/null +++ b/picorv32_firmware/tests/lb.S @@ -0,0 +1,92 @@ +# See LICENSE for license details. + +#***************************************************************************** +# lb.S +#----------------------------------------------------------------------------- +# +# Test lb instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_LD_OP( 2, lb, 0xffffffff, 0, tdat ); + TEST_LD_OP( 3, lb, 0x00000000, 1, tdat ); + TEST_LD_OP( 4, lb, 0xfffffff0, 2, tdat ); + TEST_LD_OP( 5, lb, 0x0000000f, 3, tdat ); + + # Test with negative offset + + TEST_LD_OP( 6, lb, 0xffffffff, -3, tdat4 ); + TEST_LD_OP( 7, lb, 0x00000000, -2, tdat4 ); + TEST_LD_OP( 8, lb, 0xfffffff0, -1, tdat4 ); + TEST_LD_OP( 9, lb, 0x0000000f, 0, tdat4 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0xffffffff, \ + la x1, tdat; \ + addi x1, x1, -32; \ + lb x3, 32(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0x00000000, \ + la x1, tdat; \ + addi x1, x1, -6; \ + lb x3, 7(x1); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_LD_DEST_BYPASS( 12, 0, lb, 0xfffffff0, 1, tdat2 ); + TEST_LD_DEST_BYPASS( 13, 1, lb, 0x0000000f, 1, tdat3 ); + TEST_LD_DEST_BYPASS( 14, 2, lb, 0x00000000, 1, tdat1 ); + + TEST_LD_SRC1_BYPASS( 15, 0, lb, 0xfffffff0, 1, tdat2 ); + TEST_LD_SRC1_BYPASS( 16, 1, lb, 0x0000000f, 1, tdat3 ); + TEST_LD_SRC1_BYPASS( 17, 2, lb, 0x00000000, 1, tdat1 ); + + #------------------------------------------------------------- + # Test write-after-write hazard + #------------------------------------------------------------- + + TEST_CASE( 18, x2, 2, \ + la x3, tdat; \ + lb x2, 0(x3); \ + li x2, 2; \ + ) + + TEST_CASE( 19, x2, 2, \ + la x3, tdat; \ + lb x2, 0(x3); \ + nop; \ + li x2, 2; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .byte 0xff +tdat2: .byte 0x00 +tdat3: .byte 0xf0 +tdat4: .byte 0x0f + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/lb.o b/picorv32_firmware/tests/lb.o new file mode 100644 index 0000000000000000000000000000000000000000..bd1173ac90c8144683e73d4c92c9c573e0a8211b GIT binary patch literal 3584 zcmb7`O=w(I7>2()KWU0F-t;!iG^uuKYOPwwnfx>fh;-44i!4g*LZQ%1Ch-T-G$eyW zD4Gy)Az2Jev84zG>7t7+x=`uD#Vjgx;UYr}h;$JU#YGo`x^Phv-}j#T-T6Azg=e_u zJl}iX`OeSWd+vOEdg67@^F)g$e@ZJ7sdu@a;jlR-ow7$p(;`7SEu$Ucuc9q~mX?9s zx6pd!QuEO6?373?y`7-O>ngrmTNYVeLEGKj4Z3qu{-QC^(tYU2*a}Ir z!5R{7jCCnrZ)941>$|Hf^U*qPbNt?*yDmXO%=&!^R=sdd<%63+kk}`+L{5J3&+Y`> z8;^UjZ_eM8^8U@9*#FGghe7xDzx(6wh?M&_pNzkAkl(?cwatg?FMr;6BKGa$T*R}! z06AAz_#0s!)yCe~8_wH*%-ix~4%Zs#*pGQ%#m!Y)@g#{W@c8@Yu+KTKyuXorq>t-} z`wQ&%%6;`D?mfSjK9dSMa_L$}GZpMv$36B9uJ5C3D{6n0Me%vB!Vh1^?NqJ9dbe<| ze!00T&8INbf0pDUPlHGjA6t@=3LUvv^n{O0^w@wrIe_|z=|2iCnE2(G2}v15eHp)# zE1rx3-p~;FUIR~>_%wLQ#1r7EiQfdbW}TF`5#KcZli<3E-v$3<;yG~B#2e`5N-Lfk6JaISYu|7~<`oA?gmt~j9=uH{t| z-$VafCf-1N%fwrV3%FeIgt6Uk#*?lSwd=S0&HidzzujN<*W3E-{<6Q>)^GQh{ROjL z#^>AOwYIq47XRKB?{8bb-7n_1`}K3%_}gvc|AyF({{XQa{}04={J#;~@plkw@v*<= zb%ZAvC106YtX!BYU7V5p`~uqxb2CeoIGDaPHzT2EP%6`Lf7S^@t{HaCh-*%S zu1Fho+L&v`T~jPXZ82(HV$_^T5m_-zl)H#Th}0R4QN$pjH_Bg(1}Kipd}(n}@)Ly| zs$!xT)`MX^6xPFGJrdR@1aH&XsS67;m2ivtQo2(jLlIKyk90Pw^PbLhIuluSzRR;Y zr;}CZJ+FSU>O4=fhf$%BRi6Z_pRD>cIQuLr6te1kX4Fqs{W3T^fC`1IdKH|(dz*!< zI?s>n5vmfNC93n8Q$JbtTj1<-s8GnN*TL#1t9}=pJ&Fp2tU8}r^^;Y<56(W13WcnC z6RhhctNs@_dkhr{S#>`1>L;u2gR?J$b|I_IGa=LKbh7Hh^uOqIvg$lDG8w0nRiC8) zC8v{B=QEw*%L|39dX@g;PA99*XI|$+R{bvh(Myi3I?n{14_WmG^ygiEvg$lDbUtL& zv*7G2&QDgIXPWLOS@o0j7o4B0I?p`ylT|-Yf6@8Ls{4@q4yPYP(}VxTET?e!dqb4- zhAW2G4Bs&Po#7u1KQP>hJ<5hGlcNRPH2T-%Vdvj4`hD_<(;phW z6Z_zwaQbm_wB9i?|FEE(GkV4F68Vtx+ynQFJC^+7hZifQDYTUZ*S@E;Ff&`iYk-G7 z&f1dXr*MY;kCKBI)0gPy5-#-zjIAXVK|fmZ$tb?H2mdu7@TcYX+1G`O#{=W|e-%J; zK#rM@NvH9p;xEwUa%gL&BlNA~;(W(&F*olwZnI5s0|wp?S`>TQd~29=bPI=8_5A~3 C+L!tO literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/lbu.S b/picorv32_firmware/tests/lbu.S new file mode 100644 index 0000000..027b643 --- /dev/null +++ b/picorv32_firmware/tests/lbu.S @@ -0,0 +1,92 @@ +# See LICENSE for license details. + +#***************************************************************************** +# lbu.S +#----------------------------------------------------------------------------- +# +# Test lbu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_LD_OP( 2, lbu, 0x000000ff, 0, tdat ); + TEST_LD_OP( 3, lbu, 0x00000000, 1, tdat ); + TEST_LD_OP( 4, lbu, 0x000000f0, 2, tdat ); + TEST_LD_OP( 5, lbu, 0x0000000f, 3, tdat ); + + # Test with negative offset + + TEST_LD_OP( 6, lbu, 0x000000ff, -3, tdat4 ); + TEST_LD_OP( 7, lbu, 0x00000000, -2, tdat4 ); + TEST_LD_OP( 8, lbu, 0x000000f0, -1, tdat4 ); + TEST_LD_OP( 9, lbu, 0x0000000f, 0, tdat4 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0x000000ff, \ + la x1, tdat; \ + addi x1, x1, -32; \ + lbu x3, 32(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0x00000000, \ + la x1, tdat; \ + addi x1, x1, -6; \ + lbu x3, 7(x1); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_LD_DEST_BYPASS( 12, 0, lbu, 0x000000f0, 1, tdat2 ); + TEST_LD_DEST_BYPASS( 13, 1, lbu, 0x0000000f, 1, tdat3 ); + TEST_LD_DEST_BYPASS( 14, 2, lbu, 0x00000000, 1, tdat1 ); + + TEST_LD_SRC1_BYPASS( 15, 0, lbu, 0x000000f0, 1, tdat2 ); + TEST_LD_SRC1_BYPASS( 16, 1, lbu, 0x0000000f, 1, tdat3 ); + TEST_LD_SRC1_BYPASS( 17, 2, lbu, 0x00000000, 1, tdat1 ); + + #------------------------------------------------------------- + # Test write-after-write hazard + #------------------------------------------------------------- + + TEST_CASE( 18, x2, 2, \ + la x3, tdat; \ + lbu x2, 0(x3); \ + li x2, 2; \ + ) + + TEST_CASE( 19, x2, 2, \ + la x3, tdat; \ + lbu x2, 0(x3); \ + nop; \ + li x2, 2; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .byte 0xff +tdat2: .byte 0x00 +tdat3: .byte 0xf0 +tdat4: .byte 0x0f + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/lbu.o b/picorv32_firmware/tests/lbu.o new file mode 100644 index 0000000000000000000000000000000000000000..2fefcd164b337988cfec950867dd0ba09d074197 GIT binary patch literal 3588 zcmb7GO=w(I82#S-HPx8D^d-!+jdp5cty;&KBu!cn$)Xh(U4+_&LLiw=;}5iHNJgnp zG!k(kT?|aIr3eP;qKhuFQ0c-&0u{P&ks$^|x(JBkB8x#?xG0V1y!*a4U#Gh88{WO= zoO|APf8M+I%||CrzUq0NXn69cw3x`9PS-LVR)?fRcF1U2BuJ-aG$Z~Z>dI$n>Cb-) ztyeBI_ivv&^Pbexn+a;XuHxSMg2>`3>aOOlperwxFB<(V-G`2xT}7$Xte&S1|Cm&+ zG!C@x{r3i4D-tBc%-@$_(F^BP>01wi#BQl4^74y+>Os)8 z_NW)@=KM{m^sINs{-;je54tx0-5=j0QrWxyM0`&l@4=e2jfeBEeBO9G_U-0a#IwEt zITu&?j4+N`V`uCQ$L&AjZTT^VYmId5$GETJ<*I+|NpjVbz~l4HW1aI}rKgd6sEzZ8 z+ly@XDtlLwc=!BzdOQ_m^67e}nF@9+;T`)1*Z0x25!JuSy!d=q;fF7?oT_K6cLVS0 zm+RZo+=Z_GGm;PO29YFwHj2K{;UB4+0kre=)`cNf|_W3D3!e zC!+wbDMh|lfTs*U0esQ$lfX5@Uk7fDIw^00-!$!0z$=Eo4g8bgGr-v{oD4+&2` z1V3c>r{FO~&zHeZ$ATwUz~kwm{W|z3ru{4MRwTo*-Zt&aXxudXHh5>8&?Rqi4U9X?p`rmBp|2J^k{}#CI{||86|KH%Y{|De2KGru8k5#aP z5ryjXe06fBe12LAvvaH`XQnS!V{-Pw%(R4_L8+cCSLLnpyXTxRs;9dXr2=!&#a zryX_GF;|s}QC*5^ml!2SQbJaA6Xh-;5turoK1%2$^hWthQ3s`CGFzUXm%_L*tHEO72=6bNF~xo^}@tokM3Tt5l~vFbJ8EWX_gV%2$u zqJ=<2WvVX9#7& z;Htrw4ZdOUcLx7x@Rq?HSQE`ZVDNE+$BFr80#P;k0&z5fn@0bdc-Z;ZjDC;!h|}*I zy#wpuk2w7>aWvnf#Qf8OIBoQ*!54}5JI`IJR8!BNc&tsENlSzPtnfHz4rQ@_x2;;^Of@9{;xj z&>WCs%x%(Pe5v>bx?B#e&2WUiC0rcuQC!T;_l?VJQ`~^zF%BdOh27xRSHqyAS2%R4 F?;o#amskJ* literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/lh.S b/picorv32_firmware/tests/lh.S new file mode 100644 index 0000000..d8eda91 --- /dev/null +++ b/picorv32_firmware/tests/lh.S @@ -0,0 +1,92 @@ +# See LICENSE for license details. + +#***************************************************************************** +# lh.S +#----------------------------------------------------------------------------- +# +# Test lh instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_LD_OP( 2, lh, 0x000000ff, 0, tdat ); + TEST_LD_OP( 3, lh, 0xffffff00, 2, tdat ); + TEST_LD_OP( 4, lh, 0x00000ff0, 4, tdat ); + TEST_LD_OP( 5, lh, 0xfffff00f, 6, tdat ); + + # Test with negative offset + + TEST_LD_OP( 6, lh, 0x000000ff, -6, tdat4 ); + TEST_LD_OP( 7, lh, 0xffffff00, -4, tdat4 ); + TEST_LD_OP( 8, lh, 0x00000ff0, -2, tdat4 ); + TEST_LD_OP( 9, lh, 0xfffff00f, 0, tdat4 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0x000000ff, \ + la x1, tdat; \ + addi x1, x1, -32; \ + lh x3, 32(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0xffffff00, \ + la x1, tdat; \ + addi x1, x1, -5; \ + lh x3, 7(x1); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_LD_DEST_BYPASS( 12, 0, lh, 0x00000ff0, 2, tdat2 ); + TEST_LD_DEST_BYPASS( 13, 1, lh, 0xfffff00f, 2, tdat3 ); + TEST_LD_DEST_BYPASS( 14, 2, lh, 0xffffff00, 2, tdat1 ); + + TEST_LD_SRC1_BYPASS( 15, 0, lh, 0x00000ff0, 2, tdat2 ); + TEST_LD_SRC1_BYPASS( 16, 1, lh, 0xfffff00f, 2, tdat3 ); + TEST_LD_SRC1_BYPASS( 17, 2, lh, 0xffffff00, 2, tdat1 ); + + #------------------------------------------------------------- + # Test write-after-write hazard + #------------------------------------------------------------- + + TEST_CASE( 18, x2, 2, \ + la x3, tdat; \ + lh x2, 0(x3); \ + li x2, 2; \ + ) + + TEST_CASE( 19, x2, 2, \ + la x3, tdat; \ + lh x2, 0(x3); \ + nop; \ + li x2, 2; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .half 0x00ff +tdat2: .half 0xff00 +tdat3: .half 0x0ff0 +tdat4: .half 0xf00f + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/lh.o b/picorv32_firmware/tests/lh.o new file mode 100644 index 0000000000000000000000000000000000000000..e4c99bd27507ff6c194990aad1389b67d0500e61 GIT binary patch literal 3620 zcmb7GO=w(I82w)6rzzIyq|cIR6Ps7l)~GdR+N4Q0l0_>nvM6;^q0pI5q7l+GB!g5a z8VR_NQW_`FAVGt4(S?gF)Vj<%pkzVFS~i7x!Yz4x4R z&;8B4_su8gN8a*0Pc%IFTN+GcYoDv>4~rgYl|3?;67f?h8B9xd4rS@{lynC_KszYc zYhCq;agj=DvxOSdU9_#tip=p1K?YRC1Ljy!t)**3LZZFE1d zf6v9Lko40*s*mv2q{{1x!_n(n?=EjI5@Mj|-$>rv3zQ zpW&~^m>?mikT2mZx$tBV;BBSo?@i!>;pc&G8a@KNX!tw8>6j4Syea z%kW9!_~G#6L(opcKL#H%{4?-)`dH5`@NrYW0G>p0k&rI|mQ4LOS{0TFxsP())N}6J zhW`kDG9J*ARq)G(b8R;aUk6_^d;{G6KgjKVlNXR&ctURXo80aOUV1kUuL^ z#hDrD9q9{@|8vFf~&>L*rx4LElK8G=~#EnxK% ztNs``_cAgBvFg0jx?W<{lfb#2&@RNP^UkZESoMJZSDc?%^yN=sKe8%Y`M!!VNA1sKn(H9I}B<^ya$G~l89hTmikFJ%AS5cOy zT{*63dTgSI&j25NytPH?y^1&Ve?$N;mJYrY>i|DI#3c1M|^#c$R-5-YuTQ4 z`;hoNkSCBB0YIyRVXpo0now6?kAld{J{T;`bcDWTBp$CJB=*Pi#$#o>cnCwQc7i&E QZB4!vOgcKksA>5A0gZLB$p8QV literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/lhu.S b/picorv32_firmware/tests/lhu.S new file mode 100644 index 0000000..71daec6 --- /dev/null +++ b/picorv32_firmware/tests/lhu.S @@ -0,0 +1,92 @@ +# See LICENSE for license details. + +#***************************************************************************** +# lhu.S +#----------------------------------------------------------------------------- +# +# Test lhu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_LD_OP( 2, lhu, 0x000000ff, 0, tdat ); + TEST_LD_OP( 3, lhu, 0x0000ff00, 2, tdat ); + TEST_LD_OP( 4, lhu, 0x00000ff0, 4, tdat ); + TEST_LD_OP( 5, lhu, 0x0000f00f, 6, tdat ); + + # Test with negative offset + + TEST_LD_OP( 6, lhu, 0x000000ff, -6, tdat4 ); + TEST_LD_OP( 7, lhu, 0x0000ff00, -4, tdat4 ); + TEST_LD_OP( 8, lhu, 0x00000ff0, -2, tdat4 ); + TEST_LD_OP( 9, lhu, 0x0000f00f, 0, tdat4 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0x000000ff, \ + la x1, tdat; \ + addi x1, x1, -32; \ + lhu x3, 32(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0x0000ff00, \ + la x1, tdat; \ + addi x1, x1, -5; \ + lhu x3, 7(x1); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_LD_DEST_BYPASS( 12, 0, lhu, 0x00000ff0, 2, tdat2 ); + TEST_LD_DEST_BYPASS( 13, 1, lhu, 0x0000f00f, 2, tdat3 ); + TEST_LD_DEST_BYPASS( 14, 2, lhu, 0x0000ff00, 2, tdat1 ); + + TEST_LD_SRC1_BYPASS( 15, 0, lhu, 0x00000ff0, 2, tdat2 ); + TEST_LD_SRC1_BYPASS( 16, 1, lhu, 0x0000f00f, 2, tdat3 ); + TEST_LD_SRC1_BYPASS( 17, 2, lhu, 0x0000ff00, 2, tdat1 ); + + #------------------------------------------------------------- + # Test write-after-write hazard + #------------------------------------------------------------- + + TEST_CASE( 18, x2, 2, \ + la x3, tdat; \ + lhu x2, 0(x3); \ + li x2, 2; \ + ) + + TEST_CASE( 19, x2, 2, \ + la x3, tdat; \ + lhu x2, 0(x3); \ + nop; \ + li x2, 2; \ + ) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .half 0x00ff +tdat2: .half 0xff00 +tdat3: .half 0x0ff0 +tdat4: .half 0xf00f + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/lhu.o b/picorv32_firmware/tests/lhu.o new file mode 100644 index 0000000000000000000000000000000000000000..9e7f09921949fc0307e37bf575c7032f0e786b77 GIT binary patch literal 3644 zcmb7GO>9(E82#S-l%maa>H}x^5gr19inRlULPAUzU|4iPaOJ8UUaOdt(zK(|gy@(W zV+=g1isJkPr*+a{v~+2eC+26c+Irm0M8-2l$BcmcTD@Y+7#DW zxr2Juv^T-~(g{5I3H+qt%iyzy-v_^9IQP10_#<%p{~)*VCb#h>uOqwU3Av3oxs5Nm zjW4;4FS(5`xs5ORnAt!1HmFlb2?uB=#JZ+GMpR z?^QpTcES-?4ZG^7tB%F4L>qD1aaWyiRb?otD@pAJM#+^_Fe;`=#;#x>Fm)z#R4_^G zO~$Vz6I4#fY;}HK2FHd16qQURE)U1$k+>X=%cF65O!yT>9-o`4B~jYmxjb?t(J1Xm zbXKbKT$g&CiCFbv;Bw$}V%2%>)laPY7;t$H3M69HCxO*ZtojAu^2;cYh*hrxtDji) zFM!K?Q6Lek&U;lVP<3}q^(FA~KB^*1$g1<+sh?PNz7gg9D3FL%=e<-vvFg77m-$d5 z5v$I#t$t$FTfpT5D3FL%=e^eb606<^Ts|1vg;;god-W5mevtlGou62Bz6+(TPA69V zEd8%Jomh3g8>N!diB+%D|GLwORp-4f@dJiLtomL04>_G!^)>pF^$@H6g#P41N31&E z1ziuZ>Sf^apc|i9b-o+A9%9wc(Eq0M6RXa5P2)+ddX4@e=O6xn!&zsEJ1t zzP1U!7a;Io%l>TZL+0~9u0sq1^nz>B@pw(BtM8G=KuEjYNC literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/lui.S b/picorv32_firmware/tests/lui.S new file mode 100644 index 0000000..50822d1 --- /dev/null +++ b/picorv32_firmware/tests/lui.S @@ -0,0 +1,36 @@ +# See LICENSE for license details. + +#***************************************************************************** +# lui.S +#----------------------------------------------------------------------------- +# +# Test lui instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_CASE( 2, x1, 0x00000000, lui x1, 0x00000 ); + TEST_CASE( 3, x1, 0xfffff800, lui x1, 0xfffff;sra x1,x1,1); + TEST_CASE( 4, x1, 0x000007ff, lui x1, 0x7ffff;sra x1,x1,20); + TEST_CASE( 5, x1, 0xfffff800, lui x1, 0x80000;sra x1,x1,20); + + TEST_CASE( 6, x0, 0, lui x0, 0x80000 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/lui.o b/picorv32_firmware/tests/lui.o new file mode 100644 index 0000000000000000000000000000000000000000..3a35aa53782eabb73d83461d1fa155d617aee5fe GIT binary patch literal 1156 zcmb7DJ8KkC6#gdjNCX{cnYAzx98knUm%MZlEJpCrh%6{ru9Ml31U8$nGeQJm12!TS zfdLCi;ZLy9v}x?8NoSG9e$gMWerIOx<_5IzEN8#RJ@+~HjvhRIXcz`m82F771>85Q zmemrjV-B-u+kkJ|Xgl!U665zat_0ucUBK4(@}&Q21G#-XBc9{|`{pkDxB=o%g?%ud zO!C4D>FxUNBI3Q$8|6iKFL%cy-whFeEKK&>tvspgAl@&Gws_@OFAz5iBc4ArxgIaK zJC^SRcJ7QVfA%xy{mT4a=TVJ6k;0Spvz~R%7b|!4+9R&N`%9h0-_SgDI)KTa9ww}^ zBAA*6&XP-3Vc;UkRV7({jeJqlH_7)jy-Xfz`VRRsO-tLlrXP{N(exAYLrp)Oa_}?^ zJU^u=T3M22-9faOptU^|><*HhY$|$Ng9K&GGG0a-{fe(tuv)>b3T|UNN>j*{V0MQ| zR!uf7Wcr9(E82w(SQ%bDUsjoQ0k1z-bD%K7Z3LDdf7#3YL=t2_{7+$NGl+v^l!G!3T z5JWn({`AZTe((|m#429J$>6SGzoEGuZX&LU4>>TRg%d~7O`~Yp8 zoN8`qO`aC1rk6XY@wtk&)r!d6yvXfLOR5)Fd;Ls7g6oZ)Np1u=uT{O6Y5JK#32roY zB)N**-rVd(uH|P&B>1|qEy>m8_G)hveTttMli-rgjkJ>Sj!AI2u{CK|K~Be;mf%Wb zOOmU%lJP1MeARd%$zcxhc$Xx&*4U`IYDHEt$Btyo8uROu{JqxP{Ir?p0`oaPQy0HO z%sP#TKj+1B4xV3H=XX3O)sBMvy7|c8e&*iOeynlWCVIDE(^6mDW)s^i|9cy47p+B* zUFwb7ZD70RQ|)wZ@cBIxd$UJY{fu~a9zOb>o5$y>?{vAbHui_}$Ufzd+vxjTYoy~g zn8#IY&g$o$q~<;Gy@FJ+kFb}#pudrNBFA~f`9bErU_(8Hy_>D3$2$G4Lb}@3?DW^v zut&egb2obKNA+(qD_QP!_~GkX=&W{G?|tm`Z+>b?OYq-n_BMO*-^8&08L1~umPiVJ zHd4|VItsDqNe?g|7oMyK*sc`rmw*Qie=WuYDcOT^5qrypC&K`vO40re;1h-)0zPLr zy*0z%22S25CGUYRn*1@~2ZnzL{Mhg*;B0)sc=9p$py8i_j~V_2cqbkgDY*bpG5IUt z-BFhFy$*cK zFj3z{bOff(XpABT3B6JO#b|)yL76Vi&dR{(U;#z3qZpQZ!g6m|4u$2uu-q^BW}ZBK zbY`L)F42bMV9DNS(I{<TvFbc?>L*sc4xHbC z0#V1KI?tr~iB*3HoaZHtAXc4cR{g}Pb3f;IqCgO<&NHp^C04y3IKL~j3$f}v^Xey7 zeTe>-ou62B-U+#NPA69VefnQW}G<-iKKA75bwuIbzj$C+PbStG*pLKj8W&R-Jc-z7MhL@6i9c^AoGiJ5ASQIV-S|1xchF%OnEm8rxpW+LdB)Wz6wORbmhd&eOCNV_Nd}JN4*efdfEQDg z=;I3Sy&m&Zt~2UuBWmK2h_9>>S%$!mmhGAA!Nco;T)P+n;C|51{&-Bf@u+W1L1bhf r4AxkdIOwb4;rkxI!~WPmx0UUp2}8Gbf}Fy>Hs1rhbhL$$NqqkRZ`RMe literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/mul.S.ignore b/picorv32_firmware/tests/mul.S.ignore new file mode 100644 index 0000000..0368629 --- /dev/null +++ b/picorv32_firmware/tests/mul.S.ignore @@ -0,0 +1,84 @@ +# See LICENSE for license details. + +#***************************************************************************** +# mul.S +#----------------------------------------------------------------------------- +# +# Test mul instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP(32, mul, 0x00001200, 0x00007e00, 0xb6db6db7 ); + TEST_RR_OP(33, mul, 0x00001240, 0x00007fc0, 0xb6db6db7 ); + + TEST_RR_OP( 2, mul, 0x00000000, 0x00000000, 0x00000000 ); + TEST_RR_OP( 3, mul, 0x00000001, 0x00000001, 0x00000001 ); + TEST_RR_OP( 4, mul, 0x00000015, 0x00000003, 0x00000007 ); + + TEST_RR_OP( 5, mul, 0x00000000, 0x00000000, 0xffff8000 ); + TEST_RR_OP( 6, mul, 0x00000000, 0x80000000, 0x00000000 ); + TEST_RR_OP( 7, mul, 0x00000000, 0x80000000, 0xffff8000 ); + + TEST_RR_OP(30, mul, 0x0000ff7f, 0xaaaaaaab, 0x0002fe7d ); + TEST_RR_OP(31, mul, 0x0000ff7f, 0x0002fe7d, 0xaaaaaaab ); + + TEST_RR_OP(34, mul, 0x00000000, 0xff000000, 0xff000000 ); + + TEST_RR_OP(35, mul, 0x00000001, 0xffffffff, 0xffffffff ); + TEST_RR_OP(36, mul, 0xffffffff, 0xffffffff, 0x00000001 ); + TEST_RR_OP(37, mul, 0xffffffff, 0x00000001, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 8, mul, 143, 13, 11 ); + TEST_RR_SRC2_EQ_DEST( 9, mul, 154, 14, 11 ); + TEST_RR_SRC12_EQ_DEST( 10, mul, 169, 13 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 11, 0, mul, 143, 13, 11 ); + TEST_RR_DEST_BYPASS( 12, 1, mul, 154, 14, 11 ); + TEST_RR_DEST_BYPASS( 13, 2, mul, 165, 15, 11 ); + + TEST_RR_SRC12_BYPASS( 14, 0, 0, mul, 143, 13, 11 ); + TEST_RR_SRC12_BYPASS( 15, 0, 1, mul, 154, 14, 11 ); + TEST_RR_SRC12_BYPASS( 16, 0, 2, mul, 165, 15, 11 ); + TEST_RR_SRC12_BYPASS( 17, 1, 0, mul, 143, 13, 11 ); + TEST_RR_SRC12_BYPASS( 18, 1, 1, mul, 154, 14, 11 ); + TEST_RR_SRC12_BYPASS( 19, 2, 0, mul, 165, 15, 11 ); + + TEST_RR_SRC21_BYPASS( 20, 0, 0, mul, 143, 13, 11 ); + TEST_RR_SRC21_BYPASS( 21, 0, 1, mul, 154, 14, 11 ); + TEST_RR_SRC21_BYPASS( 22, 0, 2, mul, 165, 15, 11 ); + TEST_RR_SRC21_BYPASS( 23, 1, 0, mul, 143, 13, 11 ); + TEST_RR_SRC21_BYPASS( 24, 1, 1, mul, 154, 14, 11 ); + TEST_RR_SRC21_BYPASS( 25, 2, 0, mul, 165, 15, 11 ); + + TEST_RR_ZEROSRC1( 26, mul, 0, 31 ); + TEST_RR_ZEROSRC2( 27, mul, 0, 32 ); + TEST_RR_ZEROSRC12( 28, mul, 0 ); + TEST_RR_ZERODEST( 29, mul, 33, 34 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/mulh.S.ignore b/picorv32_firmware/tests/mulh.S.ignore new file mode 100644 index 0000000..e583f5f --- /dev/null +++ b/picorv32_firmware/tests/mulh.S.ignore @@ -0,0 +1,81 @@ +# See LICENSE for license details. + +#***************************************************************************** +# mulh.S +#----------------------------------------------------------------------------- +# +# Test mulh instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, mulh, 0x00000000, 0x00000000, 0x00000000 ); + TEST_RR_OP( 3, mulh, 0x00000000, 0x00000001, 0x00000001 ); + TEST_RR_OP( 4, mulh, 0x00000000, 0x00000003, 0x00000007 ); + + TEST_RR_OP( 5, mulh, 0x00000000, 0x00000000, 0xffff8000 ); + TEST_RR_OP( 6, mulh, 0x00000000, 0x80000000, 0x00000000 ); + TEST_RR_OP( 7, mulh, 0x00000000, 0x80000000, 0x00000000 ); + + TEST_RR_OP(30, mulh, 0xffff0081, 0xaaaaaaab, 0x0002fe7d ); + TEST_RR_OP(31, mulh, 0xffff0081, 0x0002fe7d, 0xaaaaaaab ); + + TEST_RR_OP(32, mulh, 0x00010000, 0xff000000, 0xff000000 ); + + TEST_RR_OP(33, mulh, 0x00000000, 0xffffffff, 0xffffffff ); + TEST_RR_OP(34, mulh, 0xffffffff, 0xffffffff, 0x00000001 ); + TEST_RR_OP(35, mulh, 0xffffffff, 0x00000001, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 8, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC2_EQ_DEST( 9, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_EQ_DEST( 10, mulh, 43264, 13<<20 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 11, 0, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 12, 1, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 13, 2, mulh, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC12_BYPASS( 14, 0, 0, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 15, 0, 1, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 16, 0, 2, mulh, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 17, 1, 0, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 18, 1, 1, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 19, 2, 0, mulh, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC21_BYPASS( 20, 0, 0, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 21, 0, 1, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 22, 0, 2, mulh, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 23, 1, 0, mulh, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 24, 1, 1, mulh, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 25, 2, 0, mulh, 42240, 15<<20, 11<<20 ); + + TEST_RR_ZEROSRC1( 26, mulh, 0, 31<<26 ); + TEST_RR_ZEROSRC2( 27, mulh, 0, 32<<26 ); + TEST_RR_ZEROSRC12( 28, mulh, 0 ); + TEST_RR_ZERODEST( 29, mulh, 33<<20, 34<<20 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/mulhsu.S.ignore b/picorv32_firmware/tests/mulhsu.S.ignore new file mode 100644 index 0000000..28b3690 --- /dev/null +++ b/picorv32_firmware/tests/mulhsu.S.ignore @@ -0,0 +1,83 @@ +# See LICENSE for license details. + +#***************************************************************************** +# mulhsu.S +#----------------------------------------------------------------------------- +# +# Test mulhsu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, mulhsu, 0x00000000, 0x00000000, 0x00000000 ); + TEST_RR_OP( 3, mulhsu, 0x00000000, 0x00000001, 0x00000001 ); + TEST_RR_OP( 4, mulhsu, 0x00000000, 0x00000003, 0x00000007 ); + + TEST_RR_OP( 5, mulhsu, 0x00000000, 0x00000000, 0xffff8000 ); + TEST_RR_OP( 6, mulhsu, 0x00000000, 0x80000000, 0x00000000 ); + TEST_RR_OP( 7, mulhsu, 0x80004000, 0x80000000, 0xffff8000 ); + + TEST_RR_OP(30, mulhsu, 0xffff0081, 0xaaaaaaab, 0x0002fe7d ); + TEST_RR_OP(31, mulhsu, 0x0001fefe, 0x0002fe7d, 0xaaaaaaab ); + + TEST_RR_OP(32, mulhsu, 0xff010000, 0xff000000, 0xff000000 ); + + TEST_RR_OP(33, mulhsu, 0xffffffff, 0xffffffff, 0xffffffff ); + TEST_RR_OP(34, mulhsu, 0xffffffff, 0xffffffff, 0x00000001 ); + TEST_RR_OP(35, mulhsu, 0x00000000, 0x00000001, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 8, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC2_EQ_DEST( 9, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_EQ_DEST( 10, mulhsu, 43264, 13<<20 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 11, 0, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 12, 1, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 13, 2, mulhsu, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC12_BYPASS( 14, 0, 0, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 15, 0, 1, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 16, 0, 2, mulhsu, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 17, 1, 0, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 18, 1, 1, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 19, 2, 0, mulhsu, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC21_BYPASS( 20, 0, 0, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 21, 0, 1, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 22, 0, 2, mulhsu, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 23, 1, 0, mulhsu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 24, 1, 1, mulhsu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 25, 2, 0, mulhsu, 42240, 15<<20, 11<<20 ); + + TEST_RR_ZEROSRC1( 26, mulhsu, 0, 31<<26 ); + TEST_RR_ZEROSRC2( 27, mulhsu, 0, 32<<26 ); + TEST_RR_ZEROSRC12( 28, mulhsu, 0 ); + TEST_RR_ZERODEST( 29, mulhsu, 33<<20, 34<<20 ); + + + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/mulhu.S.ignore b/picorv32_firmware/tests/mulhu.S.ignore new file mode 100644 index 0000000..601dcff --- /dev/null +++ b/picorv32_firmware/tests/mulhu.S.ignore @@ -0,0 +1,82 @@ +# See LICENSE for license details. + +#***************************************************************************** +# mulhu.S +#----------------------------------------------------------------------------- +# +# Test mulhu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, mulhu, 0x00000000, 0x00000000, 0x00000000 ); + TEST_RR_OP( 3, mulhu, 0x00000000, 0x00000001, 0x00000001 ); + TEST_RR_OP( 4, mulhu, 0x00000000, 0x00000003, 0x00000007 ); + + TEST_RR_OP( 5, mulhu, 0x00000000, 0x00000000, 0xffff8000 ); + TEST_RR_OP( 6, mulhu, 0x00000000, 0x80000000, 0x00000000 ); + TEST_RR_OP( 7, mulhu, 0x7fffc000, 0x80000000, 0xffff8000 ); + + TEST_RR_OP(30, mulhu, 0x0001fefe, 0xaaaaaaab, 0x0002fe7d ); + TEST_RR_OP(31, mulhu, 0x0001fefe, 0x0002fe7d, 0xaaaaaaab ); + + TEST_RR_OP(32, mulhu, 0xfe010000, 0xff000000, 0xff000000 ); + + TEST_RR_OP(33, mulhu, 0xfffffffe, 0xffffffff, 0xffffffff ); + TEST_RR_OP(34, mulhu, 0x00000000, 0xffffffff, 0x00000001 ); + TEST_RR_OP(35, mulhu, 0x00000000, 0x00000001, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 8, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC2_EQ_DEST( 9, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_EQ_DEST( 10, mulhu, 43264, 13<<20 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 11, 0, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 12, 1, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_DEST_BYPASS( 13, 2, mulhu, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC12_BYPASS( 14, 0, 0, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 15, 0, 1, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 16, 0, 2, mulhu, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 17, 1, 0, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 18, 1, 1, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC12_BYPASS( 19, 2, 0, mulhu, 42240, 15<<20, 11<<20 ); + + TEST_RR_SRC21_BYPASS( 20, 0, 0, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 21, 0, 1, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 22, 0, 2, mulhu, 42240, 15<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 23, 1, 0, mulhu, 36608, 13<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 24, 1, 1, mulhu, 39424, 14<<20, 11<<20 ); + TEST_RR_SRC21_BYPASS( 25, 2, 0, mulhu, 42240, 15<<20, 11<<20 ); + + TEST_RR_ZEROSRC1( 26, mulhu, 0, 31<<26 ); + TEST_RR_ZEROSRC2( 27, mulhu, 0, 32<<26 ); + TEST_RR_ZEROSRC12( 28, mulhu, 0 ); + TEST_RR_ZERODEST( 29, mulhu, 33<<20, 34<<20 ); + + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/or.S b/picorv32_firmware/tests/or.S new file mode 100644 index 0000000..110bcc4 --- /dev/null +++ b/picorv32_firmware/tests/or.S @@ -0,0 +1,69 @@ +# See LICENSE for license details. + +#***************************************************************************** +# or.S +#----------------------------------------------------------------------------- +# +# Test or instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Logical tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_OP( 3, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_OP( 4, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_OP( 5, or, 0xf0fff0ff, 0xf00ff00f, 0xf0f0f0f0 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 6, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC2_EQ_DEST( 7, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_EQ_DEST( 8, or, 0xff00ff00, 0xff00ff00 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 9, 0, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_DEST_BYPASS( 10, 1, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_DEST_BYPASS( 11, 2, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_SRC12_BYPASS( 12, 0, 0, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 13, 0, 1, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC12_BYPASS( 14, 0, 2, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 15, 1, 0, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 16, 1, 1, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC12_BYPASS( 17, 2, 0, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_SRC21_BYPASS( 18, 0, 0, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 19, 0, 1, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC21_BYPASS( 20, 0, 2, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 21, 1, 0, or, 0xff0fff0f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 22, 1, 1, or, 0xfff0fff0, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC21_BYPASS( 23, 2, 0, or, 0x0fff0fff, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_ZEROSRC1( 24, or, 0xff00ff00, 0xff00ff00 ); + TEST_RR_ZEROSRC2( 25, or, 0x00ff00ff, 0x00ff00ff ); + TEST_RR_ZEROSRC12( 26, or, 0 ); + TEST_RR_ZERODEST( 27, or, 0x11111111, 0x22222222 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/or.o b/picorv32_firmware/tests/or.o new file mode 100644 index 0000000000000000000000000000000000000000..16d1f101138cf30fd07317afbcd5889087912a02 GIT binary patch literal 3548 zcmb7GO>9(E6h61@l!|2L4G)Y!#c3&mfp|B%#Bj1|!gBW)>Jt zY|<`>CWJV|G}@RZveN}g(IJsV6LF=BPJo0&7DLdLE?xr*7Np~M-o1A?uRjZKGxvPo zdFPyW?z!jQ*Ut|Ry{42RI~3ig$BbxZgMQK%irv&f>nIl^a$_;dwUaXm>3guCgH}1 z$)BkmT#-**<}*V6Hw&*Wx5-9w9w-0l+AG#(uI^wxSmXIP)-%EWFS{+Y>bl)YMQ+PR zs}k=x`6uB_Nuly(=l$Cy^JE{{57Bqp z9t*gCcFJ5sKhtX~@{QD%6#BDE=4?y^D3k5idOd7nI*wYn>ax{S?P}iq9hd zh1RN*OjahGWUi~b+f`lNS=?LMcpLDH z;Ol|!2<`woV*O8n4+`E1J|%cJ_%*@#-46v%gZGJg^n;%i{3Y;N!4HDp5&TW?O=7+8 zfDa4)KDZqY`tgGZ$CGqq@iHb} z#>C6yXuMD=QF_R0@xnP1&e?G83+MiD-XG4na6S;u1L2I7gwERA)9#-3$11{S{e=JB z#)`*^qh(Y4t<60l${HQ3wi!JOt9O8%c5T!Nku?1~%=!+k=eQP63w%xBy1?Am);=Zh zAmbe{#Nb}BHdBmywEm*dUuV2i>u(DEL&khLVsxOtZJb`lyR<$p^rsl_*80zc{u1No zwf>6G*BQT{^?}fL;w(6Ow0k(xp#MmkY-!T`Cu~JZVvJ z^i%=InGf%YLb*Wc<7o8%F;cL_Hj-&Q>H|L1ygLbBOFgzhFwSdAo$GODV^7$W{rMSx zL%AK8qlDo&D`K(2#^Y_`ZClHZWAI>!*E9#m%fpHDvZz0cB0&_oC?wODDHhXYn3+Y3 zg$~4(LI^%7MFJLAS%_qzjtdvrxO0&qb|Wq(*n*2L9=Ol=oqOM%oGM-P4ELVzJMWxx z&%O7|z4!K&cRbI76A%C3kO5l-`=x5s>lnodX7fOp&ttZLV2wKZJdamOKhZXh)#T;D zYV#)Id_N;L8C`gTxPv6#PmA2k}0N-E+k2{vhNQ zp>02DbbaFWgL|Prhv-4?bT=s`{00+uK)ilX4E=dTU-wQ9*XlE;&vi}CMMRss<6#ES zYldqc!pt$mnG*gw{=vav4Gl!c_d?^Z>IiuT&%_*K%&@i&qKUntiBa{LnE%EFj2qUy zf#}@cOaH6Q)pbJG^-%VIMAs$xs$VcNbwlY0!?)@AG_iy=Y=5%U%fL{CqAfl=5*Q$%P{idFMZJ{F;tOseXbM z0_h$4)330diwoNK5qsyGKTMlFXUaa)nLw65Em`D@M`>vEaFkev6%VHgUUih-uMtlv zexCR!`^1WeX@d70rT-=3CB^56JBq(cys7y6#6K(k5%J%OUn4#<{KI*O$Ujv46Y`GY zE%NUa|CGG1_!@bl_!s1Fsr_t_|H5I#!+nCMj&gredr8HAOMX@HE%MJ4|DJqX@gK;Y z1k881ckuQp<#xT*URbH!s-xU!ie6Z$-);}d(&|bb#%CHgYB!fHp0TQG)dj0AS~Y9c zn^s-2sxp=8N~)(*oo1?3(WtdrC|{{$DrTNG^Ng9RX1-wNi;(w>W1(4Zo2^ac+zx@6 z6pCpwwTp6g*>jM-p=XH4_;!k1<_Ja&#G=A?6@H+woU8NyUGND`l*b&-KFWItP8u^# z2~P9R2|i`*^UA&~SpE={yUM;Pc*5GZl>Ilslh*#HvOiTg$6j;mjtU;P{#S{|&RUFe z>&~rq?K*Y4Y4yhrHS5bYwum&uQmtJ>`8qG@1*Ak@mV@-jQ6;{{wVk9_1lfk*x%9&n z@8vQB<$5GuzR9~G?}Kpn(rl<)G#fwBZ*a(QKhIBch=|rHBwwFKsaN_#)|H+)!r^ie YqQMV40#b4L#>ll_n~5sUiQ4)73(dMi1ONa4 literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/rem.S.ignore b/picorv32_firmware/tests/rem.S.ignore new file mode 100644 index 0000000..7955736 --- /dev/null +++ b/picorv32_firmware/tests/rem.S.ignore @@ -0,0 +1,41 @@ +# See LICENSE for license details. + +#***************************************************************************** +# rem.S +#----------------------------------------------------------------------------- +# +# Test rem instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, rem, 2, 20, 6 ); + TEST_RR_OP( 3, rem, -2, -20, 6 ); + TEST_RR_OP( 4, rem, 2, 20, -6 ); + TEST_RR_OP( 5, rem, -2, -20, -6 ); + + TEST_RR_OP( 6, rem, 0, -1<<31, 1 ); + TEST_RR_OP( 7, rem, 0, -1<<31, -1 ); + + TEST_RR_OP( 8, rem, -1<<31, -1<<31, 0 ); + TEST_RR_OP( 9, rem, 1, 1, 0 ); + TEST_RR_OP(10, rem, 0, 0, 0 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/remu.S.ignore b/picorv32_firmware/tests/remu.S.ignore new file mode 100644 index 0000000..a96cfc1 --- /dev/null +++ b/picorv32_firmware/tests/remu.S.ignore @@ -0,0 +1,41 @@ +# See LICENSE for license details. + +#***************************************************************************** +# remu.S +#----------------------------------------------------------------------------- +# +# Test remu instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, remu, 2, 20, 6 ); + TEST_RR_OP( 3, remu, 2, -20, 6 ); + TEST_RR_OP( 4, remu, 20, 20, -6 ); + TEST_RR_OP( 5, remu, -20, -20, -6 ); + + TEST_RR_OP( 6, remu, 0, -1<<31, 1 ); + TEST_RR_OP( 7, remu, -1<<31, -1<<31, -1 ); + + TEST_RR_OP( 8, remu, -1<<31, -1<<31, 0 ); + TEST_RR_OP( 9, remu, 1, 1, 0 ); + TEST_RR_OP(10, remu, 0, 0, 0 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/riscv_test.h b/picorv32_firmware/tests/riscv_test.h new file mode 100644 index 0000000..71a4366 --- /dev/null +++ b/picorv32_firmware/tests/riscv_test.h @@ -0,0 +1,64 @@ +#ifndef _ENV_PICORV32_TEST_H +#define _ENV_PICORV32_TEST_H + +#ifndef TEST_FUNC_NAME +# define TEST_FUNC_NAME mytest +# define TEST_FUNC_TXT "mytest" +# define TEST_FUNC_RET mytest_ret +#endif + +#define RVTEST_RV32U +#define TESTNUM x28 + +#define RVTEST_CODE_BEGIN \ + .text; \ + .global TEST_FUNC_NAME; \ + .global TEST_FUNC_RET; \ +TEST_FUNC_NAME: \ + lui a0,%hi(.test_name); \ + addi a0,a0,%lo(.test_name); \ + lui a2,0x10000000>>12; \ +.prname_next: \ + lb a1,0(a0); \ + beq a1,zero,.prname_done; \ + sw a1,0(a2); \ + addi a0,a0,1; \ + jal zero,.prname_next; \ +.test_name: \ + .ascii TEST_FUNC_TXT; \ + .byte 0x00; \ + .balign 4, 0; \ +.prname_done: \ + addi a1,zero,'.'; \ + sw a1,0(a2); \ + sw a1,0(a2); + +#define RVTEST_PASS \ + lui a0,0x10000000>>12; \ + addi a1,zero,'O'; \ + addi a2,zero,'K'; \ + addi a3,zero,'\n'; \ + sw a1,0(a0); \ + sw a2,0(a0); \ + sw a3,0(a0); \ + jal zero,TEST_FUNC_RET; + +#define RVTEST_FAIL \ + lui a0,0x10000000>>12; \ + addi a1,zero,'E'; \ + addi a2,zero,'R'; \ + addi a3,zero,'O'; \ + addi a4,zero,'\n'; \ + sw a1,0(a0); \ + sw a2,0(a0); \ + sw a2,0(a0); \ + sw a3,0(a0); \ + sw a2,0(a0); \ + sw a4,0(a0); \ + ebreak; + +#define RVTEST_CODE_END +#define RVTEST_DATA_BEGIN .balign 4; +#define RVTEST_DATA_END + +#endif diff --git a/picorv32_firmware/tests/sb.S b/picorv32_firmware/tests/sb.S new file mode 100644 index 0000000..05d1894 --- /dev/null +++ b/picorv32_firmware/tests/sb.S @@ -0,0 +1,96 @@ +# See LICENSE for license details. + +#***************************************************************************** +# sb.S +#----------------------------------------------------------------------------- +# +# Test sb instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_ST_OP( 2, lb, sb, 0xffffffaa, 0, tdat ); + TEST_ST_OP( 3, lb, sb, 0x00000000, 1, tdat ); + TEST_ST_OP( 4, lh, sb, 0xffffefa0, 2, tdat ); + TEST_ST_OP( 5, lb, sb, 0x0000000a, 3, tdat ); + + # Test with negative offset + + TEST_ST_OP( 6, lb, sb, 0xffffffaa, -3, tdat8 ); + TEST_ST_OP( 7, lb, sb, 0x00000000, -2, tdat8 ); + TEST_ST_OP( 8, lb, sb, 0xffffffa0, -1, tdat8 ); + TEST_ST_OP( 9, lb, sb, 0x0000000a, 0, tdat8 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0x78, \ + la x1, tdat9; \ + li x2, 0x12345678; \ + addi x4, x1, -32; \ + sb x2, 32(x4); \ + lb x3, 0(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0xffffff98, \ + la x1, tdat9; \ + li x2, 0x00003098; \ + addi x1, x1, -6; \ + sb x2, 7(x1); \ + la x4, tdat10; \ + lb x3, 0(x4); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_ST_SRC12_BYPASS( 12, 0, 0, lb, sb, 0xffffffdd, 0, tdat ); + TEST_ST_SRC12_BYPASS( 13, 0, 1, lb, sb, 0xffffffcd, 1, tdat ); + TEST_ST_SRC12_BYPASS( 14, 0, 2, lb, sb, 0xffffffcc, 2, tdat ); + TEST_ST_SRC12_BYPASS( 15, 1, 0, lb, sb, 0xffffffbc, 3, tdat ); + TEST_ST_SRC12_BYPASS( 16, 1, 1, lb, sb, 0xffffffbb, 4, tdat ); + TEST_ST_SRC12_BYPASS( 17, 2, 0, lb, sb, 0xffffffab, 5, tdat ); + + TEST_ST_SRC21_BYPASS( 18, 0, 0, lb, sb, 0x33, 0, tdat ); + TEST_ST_SRC21_BYPASS( 19, 0, 1, lb, sb, 0x23, 1, tdat ); + TEST_ST_SRC21_BYPASS( 20, 0, 2, lb, sb, 0x22, 2, tdat ); + TEST_ST_SRC21_BYPASS( 21, 1, 0, lb, sb, 0x12, 3, tdat ); + TEST_ST_SRC21_BYPASS( 22, 1, 1, lb, sb, 0x11, 4, tdat ); + TEST_ST_SRC21_BYPASS( 23, 2, 0, lb, sb, 0x01, 5, tdat ); + + li a0, 0xef + la a1, tdat + sb a0, 3(a1) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .byte 0xef +tdat2: .byte 0xef +tdat3: .byte 0xef +tdat4: .byte 0xef +tdat5: .byte 0xef +tdat6: .byte 0xef +tdat7: .byte 0xef +tdat8: .byte 0xef +tdat9: .byte 0xef +tdat10: .byte 0xef + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/sb.o b/picorv32_firmware/tests/sb.o new file mode 100644 index 0000000000000000000000000000000000000000..fe1fa93684e5e969767f14a1f06f76c4d4b21b03 GIT binary patch literal 4884 zcmb7IZ)lZO9R9uc?rvIkx$`Psb>*v5v($O-cJ*$lH8U;Ca+ZAv25w%L7XBIT5(YwB zD~JlSuHdK_nzG%=*T_q^E|)j zcmD6ZFTSy5`&Q5MM2jbXNSTRTsvETGVuiB@W<1Puh)3) z_o=C*=S|f2p^XoH`R4A_RPlHm?X*gMV5~)b=toNQ^rhJk+G%4v=fo#U$NjtgeWO!$ z9370WEyqRbKVbYC;v7de<4sO{qGaOZjHCZv#xv#kkT~;1{t3p{Xgs$wJ3Hz1?MuEX zck5+I#I8qgO%h|xpB!5q`Z8RzzL~||p{Y{8FY_Yck%;tr5zMRiuVj3f>+?`DJ^~$U zDx-JiVe_y?QZKdedGL+i$$vcdU@|gWiV1cWV(ou{r8T!ro zr7Qgr_ElcLbOh^H8|IifwN~W#CdbSvTt7d8^}8?3GjnR2mPdb4e6PHIzK8M640B9h z9siPpwLxxuxPA!_>lX|2Okdsq$g}+=q!g}SLa=_(X?d~n_$k~8#kXVlyZcP?3r3>2 zBND|}TUD~!j}@!OtCBVNoAAHF?}y-bIe7jeJ(A#^0zZ7!!&Sv<*L#_F%D2CT1(W!X z5}kH?iA3?wEm5g54nGt(DlY+F3Ara7z_%Q}4>*Otds{p?1kmj8*T824QI7W*aEB9r z3w)*%e-HSC6EA{~IQ$dvn+`95ufqLfizlB0bU6G=@BxQ^2R`cX@0l2GlP5odW*z<$ z_yLFi3_j%W>)=-${ww${XFtZl%Oxs*f`r3I$CKdUaKIx7hRp%Z01ul3kAvg52PGO9yb4c$lh+T_h);`wS$2#L`wj^gC z0c)`=lQtG*8N(=YAQ|*xoESB2B>tQCb-2e5lU9|9QcsORPG-qf-x~LLpY2_k;S0Ro?}i zT8RpUSoLmT^%JXJ08Xt!g+i=4?-%tGt3C*v3SMZ$s-L4D-@Yuws-Fi=HBc2HR{aXF z`iWJ)3Y=Pl3WZqpTfpikR(%pUl}3d^tUB*E^%JXJ2b{upG7GWl&GaX&POSO{`uV~} zAy%FDqxy+e-%Ec$h*dvI|6JP+vFgX@&sv>W^+EcB^FXZn5dCYdpICL?zv?GeeU$!n z)=#WD?`QQBt6l}1;s*%|vFg0P)laN?EB(#ZPpmrccl8siUZB6l`iWKN{jYvv)raYS z#QKR<=Y6VvV%4wGzux+ZRp))Heqz;U0jD-tKe6h(kJV4CdMo`Kt)EzR-q-3UR{bdb z{GdZ2R-N~``iWIPL;qvePpmrcd-W5meuMs2>nB#7?>F@mtDXW*ZL)r1)f12s!AD6Q zaBc9x!f(w)@UeHm!6zMj*1?w?eAB`F=FxVt4sLhw`wkv<@Ok3L(HP1NM;|BNZ1pkue!=Q4sxEr{3hsDy+^ZLO;=N>!@N9=RIq9a`g zI`JvM7eC&Cozk!eFU$W?e0Z_s;kRoRxPZR3C|n4ExHSl@xEE(1XNyOQ`HaoNZ+XBm zT~kgYa8H2w(DqgV^D0!|7aE`mg>AC%iLD9CS^Cf^kM(o-k@B4LIBQ#gauz~C8v$3y Q|H^WGLlA;j2h&2|-?~jIDgXcg literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/sh.S b/picorv32_firmware/tests/sh.S new file mode 100644 index 0000000..387e181 --- /dev/null +++ b/picorv32_firmware/tests/sh.S @@ -0,0 +1,96 @@ +# See LICENSE for license details. + +#***************************************************************************** +# sh.S +#----------------------------------------------------------------------------- +# +# Test sh instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Basic tests + #------------------------------------------------------------- + + TEST_ST_OP( 2, lh, sh, 0x000000aa, 0, tdat ); + TEST_ST_OP( 3, lh, sh, 0xffffaa00, 2, tdat ); + TEST_ST_OP( 4, lw, sh, 0xbeef0aa0, 4, tdat ); + TEST_ST_OP( 5, lh, sh, 0xffffa00a, 6, tdat ); + + # Test with negative offset + + TEST_ST_OP( 6, lh, sh, 0x000000aa, -6, tdat8 ); + TEST_ST_OP( 7, lh, sh, 0xffffaa00, -4, tdat8 ); + TEST_ST_OP( 8, lh, sh, 0x00000aa0, -2, tdat8 ); + TEST_ST_OP( 9, lh, sh, 0xffffa00a, 0, tdat8 ); + + # Test with a negative base + + TEST_CASE( 10, x3, 0x5678, \ + la x1, tdat9; \ + li x2, 0x12345678; \ + addi x4, x1, -32; \ + sh x2, 32(x4); \ + lh x3, 0(x1); \ + ) + + # Test with unaligned base + + TEST_CASE( 11, x3, 0x3098, \ + la x1, tdat9; \ + li x2, 0x00003098; \ + addi x1, x1, -5; \ + sh x2, 7(x1); \ + la x4, tdat10; \ + lh x3, 0(x4); \ + ) + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_ST_SRC12_BYPASS( 12, 0, 0, lh, sh, 0xffffccdd, 0, tdat ); + TEST_ST_SRC12_BYPASS( 13, 0, 1, lh, sh, 0xffffbccd, 2, tdat ); + TEST_ST_SRC12_BYPASS( 14, 0, 2, lh, sh, 0xffffbbcc, 4, tdat ); + TEST_ST_SRC12_BYPASS( 15, 1, 0, lh, sh, 0xffffabbc, 6, tdat ); + TEST_ST_SRC12_BYPASS( 16, 1, 1, lh, sh, 0xffffaabb, 8, tdat ); + TEST_ST_SRC12_BYPASS( 17, 2, 0, lh, sh, 0xffffdaab, 10, tdat ); + + TEST_ST_SRC21_BYPASS( 18, 0, 0, lh, sh, 0x2233, 0, tdat ); + TEST_ST_SRC21_BYPASS( 19, 0, 1, lh, sh, 0x1223, 2, tdat ); + TEST_ST_SRC21_BYPASS( 20, 0, 2, lh, sh, 0x1122, 4, tdat ); + TEST_ST_SRC21_BYPASS( 21, 1, 0, lh, sh, 0x0112, 6, tdat ); + TEST_ST_SRC21_BYPASS( 22, 1, 1, lh, sh, 0x0011, 8, tdat ); + TEST_ST_SRC21_BYPASS( 23, 2, 0, lh, sh, 0x3001, 10, tdat ); + + li a0, 0xbeef + la a1, tdat + sh a0, 6(a1) + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +tdat: +tdat1: .half 0xbeef +tdat2: .half 0xbeef +tdat3: .half 0xbeef +tdat4: .half 0xbeef +tdat5: .half 0xbeef +tdat6: .half 0xbeef +tdat7: .half 0xbeef +tdat8: .half 0xbeef +tdat9: .half 0xbeef +tdat10: .half 0xbeef + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/sh.o b/picorv32_firmware/tests/sh.o new file mode 100644 index 0000000000000000000000000000000000000000..d2b573abb15c2acb0f82d1c3e4982eabdacf902a GIT binary patch literal 5024 zcmb7He`sCh8Gg^bNt)K|a&Jz%Tx(a4xmDbZF*iwjQ*CQ%tv{niw}At(i8ooR*czJ4 za3Gl44a!!e^@_^o+$~m+R^*PUS7-?V6$+~*VJ!>>8fXQUKB(>>!z5HUT5~g~j_=mY|&X>6~4d1ccOYj{Tl-k-$)9@V&Q-e}`Wp1nU z9btb*Bv)pCBT{>p{kNeap*J)%u&5Z$|<=k&ykFgw(c}oaJGv%KmQ&Q!}`SzGkr= zQ?s9TV8bzP$)z*!2U7ct>-5>D=>O(0(JtjgB=5LMj&zwa5^)CO1%wMqiRX%&>1aq{HT*%zf_`IAs zQG9vsI+tsnErFS@$*msubIr3?GJjv3KYbkeKXUoz*=d_U&u3SUF~{#Cw~F~kr1mxE zK79=NS1-+vOumk{7GXc8dU9^PySYDGa>du?R=GU0-aSk6(k8Fdj9J&)oUtvPIA0l; zYvw%oJ-Jc4jy>2mXMQ`izUms=K^!etfIqxbRqB>tU?uV2Wdq*>SChp(mDRBrLT=TO%^uU?wI z@(;uOpOIWrNkx+Q^CKxu#t}I&kTzicYy@&Oz&fRH-vEqdi6fAk6`E^OdU1WbNyR`4 zfWu0Wk0q36J-!{d;_)HiQy%{*aLVzd`~vt(#{(GwPP-RIAUnYaJiZ5f#N)rBA3qyO zc@E&9cmFrw?eSf%*zbX7y!&PF%O3wDct2{HjX>T6D0%!ic-7;71z+&^3Gg1bErEOl zzRTl(13&8Vzk^@!_&>q3-g=)0ANKfH;Q#RW0{CJi9IGFFZ;LZ-7z+78gLQ-16 zTRolvU*YkU;EU%cDXYQ#^Fr>Q2Xg;BkXKxPfywvJ1MmC$PwwwOxxfG9{{EBu`%Qin zKO6RWvkkn}Es(u`X9GXbz&~!_t=@i_@ip*?2L4V1zu3Sdw?TG1k2dhvJbo?aa>|>} z^~B!zZUW!r@jUo*9xs4@=<&_qmp#4>e83yuz2N?Q9s>90^K)>2K97O>^C^P+^LYwf zBQ1gKUczywyEHyo+OcPJ_qcRV?B#XGp7Cc(j*LCCXIzY@S4v}}CHdv(lTTZr&tCfN zWxc&@Fs=bh3icASjh5wmj73@AFp3;V9#1jXxbuA6dp_289WR;fSnbZ3NMF1`l&*<&UR3A5|Bkq55Ub8_`s`28 zAc$3GeNaEK>OTX{-h>80tUBw5`iWI%ZO?Y0K@h860aib;>PLaI@e7Sub=IGb_$5TF z`f2*{?ZhBfo%Kom#HwEe&fbCsL99CKm->lSXD!Wg!4Sl%v%aaHSoKZx<2#%|tUBvo zM`(3o)yL@P3mZYKI_snQiB&&De@uu~XZ`G0W&0sk{cZZWu?S+-XX$UXI0fVk zV%1rH)laN?8*p}m^%JYk`mBCp)$gI7A0!B3)em@nV$~1QKVbdDsa4fwCsw^g|0e4vR-N@&{luzQ>ECSq z#HwHP{KTp+(9aJ#1hML@=h{E9>g#~Bw_884>a6$bCszG2`UkC_SarVN)K9GX>-2B6 zeqzu^?_s{rR6pS1lOF!k!`~3! zfsPUDaAq{Ohj^RS$2@(4_)e==JpCPFeoQ0gJ^do_T~?2O=FYu7JU((92i6>XVj2POCfG{_H55@m!vo5m zhlY>fhIo4CVWaxO+!FfZ_3!wiJLp8f$ot4CFK10K^2To2e{x6u19Q*xSNfZ3zU=@1 zhWWXPfINS*mWP`vs*|LHMRIv&4pvBNHl%uU!hwMC_FT-MoV@41^}$fs>P45y zBslB$BAABWb+GW+9Hrq8+sfx)9Y(5|l{7ke)C~>#4CcRWlDQAhVx=Gk3Cc_NR zEgMFikfUm_voHx!Z^yBz`WIBG(i58zpm#o@TeDZGFd=?m4w@{IPUEUxXWF;+s@T5J zE%~h3ep^iHdVlHELnh3nEc>Y6Jzet_=<25(F3@c+QY^D@U&NU0S7JP?d*s266%noO E2k3l7K>z>% literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/sll.S b/picorv32_firmware/tests/sll.S new file mode 100644 index 0000000..d297ac5 --- /dev/null +++ b/picorv32_firmware/tests/sll.S @@ -0,0 +1,90 @@ +# See LICENSE for license details. + +#***************************************************************************** +# sll.S +#----------------------------------------------------------------------------- +# +# Test sll instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, sll, 0x00000001, 0x00000001, 0 ); + TEST_RR_OP( 3, sll, 0x00000002, 0x00000001, 1 ); + TEST_RR_OP( 4, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_OP( 5, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_OP( 6, sll, 0x80000000, 0x00000001, 31 ); + + TEST_RR_OP( 7, sll, 0xffffffff, 0xffffffff, 0 ); + TEST_RR_OP( 8, sll, 0xfffffffe, 0xffffffff, 1 ); + TEST_RR_OP( 9, sll, 0xffffff80, 0xffffffff, 7 ); + TEST_RR_OP( 10, sll, 0xffffc000, 0xffffffff, 14 ); + TEST_RR_OP( 11, sll, 0x80000000, 0xffffffff, 31 ); + + TEST_RR_OP( 12, sll, 0x21212121, 0x21212121, 0 ); + TEST_RR_OP( 13, sll, 0x42424242, 0x21212121, 1 ); + TEST_RR_OP( 14, sll, 0x90909080, 0x21212121, 7 ); + TEST_RR_OP( 15, sll, 0x48484000, 0x21212121, 14 ); + TEST_RR_OP( 16, sll, 0x80000000, 0x21212121, 31 ); + + # Verify that shifts only use bottom five bits + + TEST_RR_OP( 17, sll, 0x21212121, 0x21212121, 0xffffffe0 ); + TEST_RR_OP( 18, sll, 0x42424242, 0x21212121, 0xffffffe1 ); + TEST_RR_OP( 19, sll, 0x90909080, 0x21212121, 0xffffffe7 ); + TEST_RR_OP( 20, sll, 0x48484000, 0x21212121, 0xffffffee ); + TEST_RR_OP( 21, sll, 0x00000000, 0x21212120, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 22, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_SRC2_EQ_DEST( 23, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_SRC12_EQ_DEST( 24, sll, 24, 3 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 25, 0, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_DEST_BYPASS( 26, 1, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_DEST_BYPASS( 27, 2, sll, 0x80000000, 0x00000001, 31 ); + + TEST_RR_SRC12_BYPASS( 28, 0, 0, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_SRC12_BYPASS( 29, 0, 1, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_SRC12_BYPASS( 30, 0, 2, sll, 0x80000000, 0x00000001, 31 ); + TEST_RR_SRC12_BYPASS( 31, 1, 0, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_SRC12_BYPASS( 32, 1, 1, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_SRC12_BYPASS( 33, 2, 0, sll, 0x80000000, 0x00000001, 31 ); + + TEST_RR_SRC21_BYPASS( 34, 0, 0, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_SRC21_BYPASS( 35, 0, 1, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_SRC21_BYPASS( 36, 0, 2, sll, 0x80000000, 0x00000001, 31 ); + TEST_RR_SRC21_BYPASS( 37, 1, 0, sll, 0x00000080, 0x00000001, 7 ); + TEST_RR_SRC21_BYPASS( 38, 1, 1, sll, 0x00004000, 0x00000001, 14 ); + TEST_RR_SRC21_BYPASS( 39, 2, 0, sll, 0x80000000, 0x00000001, 31 ); + + TEST_RR_ZEROSRC1( 40, sll, 0, 15 ); + TEST_RR_ZEROSRC2( 41, sll, 32, 32 ); + TEST_RR_ZEROSRC12( 42, sll, 0 ); + TEST_RR_ZERODEST( 43, sll, 1024, 2048 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/sll.o b/picorv32_firmware/tests/sll.o new file mode 100644 index 0000000000000000000000000000000000000000..5c94567e43224d8aeb2dca3e18bf95308b038a36 GIT binary patch literal 4292 zcmb7IU1$_n6h5;*F;-b8+1UD5T`_G1+jMtlW0I0vUWv6D>iL?2(*-d+6c`N~`k|hy@_F=&mg!-_c4?@B8J9F=yIcxQySLWXD zJLlYQ&OP_e%*Ky*bi83%7MW(zeF_-SsYS|@@rJcjOY^8DN)(SqsilVOlNjC8QCgGu z0k*|-qOxjku&=ZEa7$o+P(m?ETtKweeV% z-1DV`yU*K3j>ubBYZyEMH>%Xbu z{rf(Q#|o^!TiNw}f15-6DC_T1c6r}%*55UeSiQQKx9iQlCz`;|uB?y8rr5tT@T(jq z_H5l+JloV5k4>|GN8nevOk64yif3b}Lz(^C0>7z6dwV=qA@{S=mcS?TA`9!=9Qf#w zS1Ug+oBf*tzpea!UJ3SZ2>kuZ@8^|de_P-$>-n5l)^abDT9l7alggYr2j2c!sBg2{ zKdiOD=Y#jV%W^MHJ7&Kf-dAtG`z_Zl!Jb5{jo7?}y@URADjp(z&Q#6fCoPJH>Zuq? z(4B_8kCbi!^JiWSVpaX(INMe6^?M(w`;A)el9_cuysD`e|M(mmbG)-RZn-OGUJB;u zd`vFSnp~zV_w&*VL0p+wmun;QR(VWweb)rB70cvM70-ElIh0Yq(kefmbG07J!>>t& z_viWQ*eB%T*MvgurP9)>cu!x~#;nuN#STILIgaNXcu%Wx_Un-d;ruREab>laPpwBX zg!R>_*ox(y6VBoBct3}12=!ZJa^SfC;KPCsg8wS`5cr6w&qv@l1wRG; zK=9MxYsLBt;GKeB03Q~d&&qd#e+_ zOW;eydV{k`c$--C2mGet)kV~l>lw@)I^KP(hno5acsz8xXDH{BBPWjckQbAt_qyNj zQ`k{MMh(qsSg(c_HMFXsO%17}9#eWu>rpGEv{XuKrL!r0`TI;2?URvupTF=pXj@EOuo}={~t>B1azpHZ9k79*mvOgp=V?3JYn7ef!v^ym3_c_9Wq~IJo)!3>z!98H zqq9QbjRGGOcv#>Ofv*ZYEARt>8}N*qdnE<#5cr6|!vYrs9%rlzH!198#_EqUx+m-n zco*2sSTtIKv99Mv#_N^6UD$gWw>Z3ZD*FLpA7Z>o*-r`k7~|KK{i?9fGTyB0WnqutOxamww;Ag?WEgKz_N=hK zBXF<4Ljs={c!V+k7(u%WT(?bOY8w3DSg!jp#@v7!dkq@s>FdVpkY9dBx^vysbQlln z|7Z!s;)s!cbcnbA9`0=#mhZLY=ox1{hVL7Ga4p3Ca464bAO8m9-&)M!@>;?OYi{&j z2IulUEsiy~@ra}7H`dESgk`tlVm*HL=i@S3fYkL2zR^Ym+(7)yt%~c!|3##Df^H`6 EUlb3DRsaA1 literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/slli.S b/picorv32_firmware/tests/slli.S new file mode 100644 index 0000000..a51eec9 --- /dev/null +++ b/picorv32_firmware/tests/slli.S @@ -0,0 +1,68 @@ +# See LICENSE for license details. + +#***************************************************************************** +# slli.S +#----------------------------------------------------------------------------- +# +# Test slli instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, slli, 0x00000001, 0x00000001, 0 ); + TEST_IMM_OP( 3, slli, 0x00000002, 0x00000001, 1 ); + TEST_IMM_OP( 4, slli, 0x00000080, 0x00000001, 7 ); + TEST_IMM_OP( 5, slli, 0x00004000, 0x00000001, 14 ); + TEST_IMM_OP( 6, slli, 0x80000000, 0x00000001, 31 ); + + TEST_IMM_OP( 7, slli, 0xffffffff, 0xffffffff, 0 ); + TEST_IMM_OP( 8, slli, 0xfffffffe, 0xffffffff, 1 ); + TEST_IMM_OP( 9, slli, 0xffffff80, 0xffffffff, 7 ); + TEST_IMM_OP( 10, slli, 0xffffc000, 0xffffffff, 14 ); + TEST_IMM_OP( 11, slli, 0x80000000, 0xffffffff, 31 ); + + TEST_IMM_OP( 12, slli, 0x21212121, 0x21212121, 0 ); + TEST_IMM_OP( 13, slli, 0x42424242, 0x21212121, 1 ); + TEST_IMM_OP( 14, slli, 0x90909080, 0x21212121, 7 ); + TEST_IMM_OP( 15, slli, 0x48484000, 0x21212121, 14 ); + TEST_IMM_OP( 16, slli, 0x80000000, 0x21212121, 31 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 17, slli, 0x00000080, 0x00000001, 7 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 18, 0, slli, 0x00000080, 0x00000001, 7 ); + TEST_IMM_DEST_BYPASS( 19, 1, slli, 0x00004000, 0x00000001, 14 ); + TEST_IMM_DEST_BYPASS( 20, 2, slli, 0x80000000, 0x00000001, 31 ); + + TEST_IMM_SRC1_BYPASS( 21, 0, slli, 0x00000080, 0x00000001, 7 ); + TEST_IMM_SRC1_BYPASS( 22, 1, slli, 0x00004000, 0x00000001, 14 ); + TEST_IMM_SRC1_BYPASS( 23, 2, slli, 0x80000000, 0x00000001, 31 ); + + TEST_IMM_ZEROSRC1( 24, slli, 0, 31 ); + TEST_IMM_ZERODEST( 25, slli, 33, 20 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/slli.o b/picorv32_firmware/tests/slli.o new file mode 100644 index 0000000000000000000000000000000000000000..7a13bdbb9cdd4aedf2502401efda80190c970574 GIT binary patch literal 2596 zcmb7FO=w(I6h3$UI>q{UnU`vsw02@zn?)V+CP~vm7enzUiy)y`a3Lhqmys0HbjZv? zQE(vcEMe*k610?n8^JCD{!GCx0wM?%&5#xZ7X}(33y}d`6p_a7ynFA=Nx+3?xc7YD z_s%=#-t+Ez^WKXSFDa$Snxa3c!-%%i`pQV;1}RMkXe>$OC6hFkB6kr!xSphe?AOo^ z)3w&|-OAkD6%G%RTQSyogyd3q1DfNK=VU4PxOqxz(7`=th=RJ+%Frn7IRy$nYM#__ zThw?3b)88HZZ-$B)=~|JYMwJq!H2B1c6E)`uIH2~SZVfajcaT{t5I;Pd0cBzjYpnS zr(oG?sPW@2;#PTm$8?;nvBv8=*2wnvhc!3Dbs9O~rDrmpv(EMVI@esR^}>a4DR;ti zHaP#0&b2Z%Zq@7Il7szi@&2CfT;n~Ck9$sw>mTmub`7MkelOa4-S)^;!SaUZ#n9WR z$7S*s6?w4?g|RF>eCpz3-OH>B+|8~|+!lFwMtfqrFFw{i9#TQ?=98V+mWpEc$7c{9 z^}nEk%;poFc&x$J@3HkK75aD3#&Evy2G(HXuuffjTH*O7Wt@)18f+}DGpbuw=wCc^ zTMB!`*{GpE8w!1hdG&(P>MH2oz<$=_IJa(?oJ@GBY%)x>65fGToXxK=zBA*2@xM_8 zz0~oDORXisl#G3VbN=g3*usBWe9v1%6vt0moDxw)wk;|;1k6L5q9Xu}}Ux4oj{tbAK=-0R4=LNq9 zJ|p-hcwO*cz*hx-2)-jY?|nto`vZJk@V~%+7yNJVqvC!%GAan30-qK9Q2SoO=~UFU zha*|8TB=m1=8IQLlq)Z=pPDbdRc(`*Yx5%wk?Z&h_tKB*6 z{2}9g5%^t!>jK|q+>gYtJ3{}N@v~ar7J3@z z&mGWuH)FH+(~M7O{jAVmWqeZW(?YK?<_{R`y3lV5ye9CMjI&WVCF1D+pvIJ|ynVG= zybNDm(0o>Zd07M02-UkcN&=6YA^4P;~Z@4(U!Jx9Dkp9y{9lZAD`QU7&aFm Y{eXq_+9co>cI}H>!y{DR>eXQ5wSs!QrecFd}{o8o) zwGssrl^1wSI9^?>`SCm^`Toz_Yq`^MEMK4E>wES6AF?L zyyiLoTu7XUts8q)Ie(+ecv853M@aLSQ<)PA@k-uqTFq4ocFjw{kH1ZYLrKm z^V0Y@?-J@)*`nho_58TLocl8GNz||MsE#ES`66~%F0uEN3NBVQ>iClO=2|TEkK(!J zGwlBe$8!vxDOHz8T#vE}N|klBxbfvV#Pyix`L)zyGdk}F)}zYxd)UVF-1u3o%Om!t z1m?G@J~kWq*Tu*6a1xl`N*S;H2kQOfdSuu?#m|WUc)W)b!5X7oLT-AmCV~x>OOS&HZ< zfwO||0$ymaf+7#F*HXlH0S^e?4SZ7Y1HdK0Uk1J+_^ZG(f*%H+6FdOEFZi3lj5^S5e)Sl`Xy zJ%VoqFABZ`{IcLa_;tbefd4G`KJYt&9|Yfy{|34#>IYxIVfkyo+r<12gC7$7DERw= z^V&`cJ_3G6@FMtXG2gerI|b*xa7^&`z|RT(G5Cz&6X1UdegV8y%0cLc5q z?BKa{+K>oZD`PXqZpKe*y-(;x##yb83;iNvSL;`Vev>hOpwMm!eSxtldIO$ad*5x0 z+jV?a=!Y10XnjEFXBqF-dP(S48RxWqUFdU+JGK6s(3`Lc9R6^ktz~TL(9ZZ7t#=E3 zkntX^7lb~+_*tz_3jLbEHwB&(xGL~{#{8j2>%ksuc}`<$8++?`F@F?&aa8xmEE*je z&f`_ZFQ&nKF;8tr@v!}mmO(7G2ASj;50CFj2><{9 literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/slti.S b/picorv32_firmware/tests/slti.S new file mode 100644 index 0000000..730cbe2 --- /dev/null +++ b/picorv32_firmware/tests/slti.S @@ -0,0 +1,70 @@ +# See LICENSE for license details. + +#***************************************************************************** +# slti.S +#----------------------------------------------------------------------------- +# +# Test slti instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, slti, 0, 0x00000000, 0x000 ); + TEST_IMM_OP( 3, slti, 0, 0x00000001, 0x001 ); + TEST_IMM_OP( 4, slti, 1, 0x00000003, 0x007 ); + TEST_IMM_OP( 5, slti, 0, 0x00000007, 0x003 ); + + TEST_IMM_OP( 6, slti, 0, 0x00000000, 0x800 ); + TEST_IMM_OP( 7, slti, 1, 0x80000000, 0x000 ); + TEST_IMM_OP( 8, slti, 1, 0x80000000, 0x800 ); + + TEST_IMM_OP( 9, slti, 1, 0x00000000, 0x7ff ); + TEST_IMM_OP( 10, slti, 0, 0x7fffffff, 0x000 ); + TEST_IMM_OP( 11, slti, 0, 0x7fffffff, 0x7ff ); + + TEST_IMM_OP( 12, slti, 1, 0x80000000, 0x7ff ); + TEST_IMM_OP( 13, slti, 0, 0x7fffffff, 0x800 ); + + TEST_IMM_OP( 14, slti, 0, 0x00000000, 0xfff ); + TEST_IMM_OP( 15, slti, 1, 0xffffffff, 0x001 ); + TEST_IMM_OP( 16, slti, 0, 0xffffffff, 0xfff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 17, sltiu, 1, 11, 13 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 18, 0, slti, 0, 15, 10 ); + TEST_IMM_DEST_BYPASS( 19, 1, slti, 1, 10, 16 ); + TEST_IMM_DEST_BYPASS( 20, 2, slti, 0, 16, 9 ); + + TEST_IMM_SRC1_BYPASS( 21, 0, slti, 1, 11, 15 ); + TEST_IMM_SRC1_BYPASS( 22, 1, slti, 0, 17, 8 ); + TEST_IMM_SRC1_BYPASS( 23, 2, slti, 1, 12, 14 ); + + TEST_IMM_ZEROSRC1( 24, slti, 0, 0xfff ); + TEST_IMM_ZERODEST( 25, slti, 0x00ff00ff, 0xfff ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/slti.o b/picorv32_firmware/tests/slti.o new file mode 100644 index 0000000000000000000000000000000000000000..f7449ab6651925eb6b9e808cf896b010888ab30b GIT binary patch literal 2580 zcmb7FOK2Nc6unQsI5bU1meV?RN|ZVuFI=G++i|ngBK<5(F(rX43XU>SNT}inON*2S zB5)RkW+6Hun6?y&W?^U+hSFxyEDUX-(2ay02y{_HD0C5mpk9P7>Yn>P(zT(BJn`N= z=gfKczIpRzbo1@mca&1(nxem{&xke#%#|q}#%X}|&`gpjlT6Y~io7Mn@OF~MvOhpO zK-ap5x2xsa6}Cso%^2(4Bjzpi{g}HyOX2686A^jP(6yGQaJh3VqCB(;G!MQ4gNysqcg zyW9OWHhI3#+0ScV<@%$hmdmlm^$&_1c3o{=|7*71wwb@l^PzDq5BJ3D>hk;pMuV>F zkV1WEs}!xati4Dueyn z;T>Wx*Uqc((E7{9ODbwLNPBnt2VL%h3WwHTGJdSB)$P|Gb~)!1p6_1c@pSE|Rqy+H z>pZWpKS|?T>(z}~n|*I@ofU=i5s$KNf9lwucKiWtQ&jK1l4&}p$AqlK*Y-9d8X$96#CO zl+ccBPgJxIn7e6;4g!oj3iokf^WL$j=uM0(c=o0#3IN`76xUAye<*kXxFYzwz_$c{ zA9z{tv%vQS=Ui)ohrk)00BNwkNlt_C5 zx>USUHh9v6DHEnmIBCL+32&Kj$^<`eqioRKCsS+ho4Y=G%0>%@^2wfz21# ze1Xju*nGh>Rf^Rrbdu8r`%1f#(D+3tSiYj=(DdKNOfhBrYePA&2=qI6Nfqgun%X&j@^3 z;2Q!jGd_YMX!nHvGvham-WK{6<1wQX&Z1k-Fyo^}KPvPB<6}mj6?&O5f56bL3;k1p zn*!fsoYi*P0#1(`Ou6dES8K%!h_yu%FFUkYDi`qz@PWTrtQ9GD0f*%US{7d1F4@Pf zzqQX%+ckSkXcPkDg1zt<6Mn@+J|aAyukm-BZO06|yAII#Tiqgu& zkFYJGBb61ix&AB_qva6W__#t;h$HF6QX+FD1|3U~d#3chvfIW!5sx*Kd#?1ZviBML zY&@1Bceu1y*~{8K1A8aAL&{z(*c7)a7Jo)DR)MdJ+%HSJ`I=$@EIz+D$k+C&Pg7f&K3Ue!m_|`G?s5R^T^vg-H2F*uOpSo7&L3*f`(+n^y|Qj-l=bzqUc};PQre zY=Zq;1HZ2A_lb$(V5}}4n_~Z#z;9{`&lU$aG{<9Q_HPdSrnVXQd%NPX3i~$&ep4Iw zjV$+UX=C7{hu*sRwb|@nANXzM_iIbAe_i13Q~sE#t(pDpfxoQ%rnU_GTLXV(Hdxb6 z3;Uymdm6WJ&r{xh;oK)FYigOW+^k#&8$X!wjU+nZ4`+NlbnF=E& z(^}8Hv!M2j_*NPNx+-r1LN{GyMWdj5-YWb?Zp z@rbJ#j}&WU>`lD;zd4WFdFlvPeX|gS@lTF0MZAcFZ?vcmnh!NBS`5)>5YaC}Hw%6l z`UbwA)UYT8vCSaj+o8JzXP^fJZ-pKb{5JHM;Jwf{1b+y9U$6^Z=YN4(bP&8oa1Ojp z@TcGdf{%kw3jP8-Dj4fYlY+kn-xd5FID%(K4U4{qXcT-A+#&d9aJS%V;DX@az~=-{ zgU1E`3BE4)4!9!tZ*U@vlQ;O+1<@YC|ALPS4&z=%1Y+e2PViayGId`M|W zO=&f?sA;X5TGiC1rgk+YoAsR3b4t%TQ&Oi&>Rd^kEUB|4b-JX^m(uxCI$uiXOX++m zoiC;HrF6cO&X>~pQaYcb^Eo=7qw_gBpQH0RI-jHSIXa)C^Eo>YcfvfHe6AJVKd%AOJSZq}QW zy-(Or2z^fIQK7F3J;|DXj9@fiFV}BYnwoN-9L{I=W6t-h`G8UVJ%_S*9rDYsJDbl^ z(|$at|6?Q&i>*ic(IH;`Wd@+p7H=%oI-`*Cb@&Z~bwkPC^&AJ2_gjne!R3ukk&6u` z-x_Fc>(k;m2M?aHMg76~GDyN{U&q1u_}QO}!{mabp=ac89+ijf_?cT3SHS;WB-x>d H`P}~iEot$r literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/srai.S b/picorv32_firmware/tests/srai.S new file mode 100644 index 0000000..4638190 --- /dev/null +++ b/picorv32_firmware/tests/srai.S @@ -0,0 +1,68 @@ +# See LICENSE for license details. + +#***************************************************************************** +# srai.S +#----------------------------------------------------------------------------- +# +# Test srai instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, srai, 0x00000000, 0x00000000, 0 ); + TEST_IMM_OP( 3, srai, 0xc0000000, 0x80000000, 1 ); + TEST_IMM_OP( 4, srai, 0xff000000, 0x80000000, 7 ); + TEST_IMM_OP( 5, srai, 0xfffe0000, 0x80000000, 14 ); + TEST_IMM_OP( 6, srai, 0xffffffff, 0x80000001, 31 ); + + TEST_IMM_OP( 7, srai, 0x7fffffff, 0x7fffffff, 0 ); + TEST_IMM_OP( 8, srai, 0x3fffffff, 0x7fffffff, 1 ); + TEST_IMM_OP( 9, srai, 0x00ffffff, 0x7fffffff, 7 ); + TEST_IMM_OP( 10, srai, 0x0001ffff, 0x7fffffff, 14 ); + TEST_IMM_OP( 11, srai, 0x00000000, 0x7fffffff, 31 ); + + TEST_IMM_OP( 12, srai, 0x81818181, 0x81818181, 0 ); + TEST_IMM_OP( 13, srai, 0xc0c0c0c0, 0x81818181, 1 ); + TEST_IMM_OP( 14, srai, 0xff030303, 0x81818181, 7 ); + TEST_IMM_OP( 15, srai, 0xfffe0606, 0x81818181, 14 ); + TEST_IMM_OP( 16, srai, 0xffffffff, 0x81818181, 31 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 17, srai, 0xff000000, 0x80000000, 7 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 18, 0, srai, 0xff000000, 0x80000000, 7 ); + TEST_IMM_DEST_BYPASS( 19, 1, srai, 0xfffe0000, 0x80000000, 14 ); + TEST_IMM_DEST_BYPASS( 20, 2, srai, 0xffffffff, 0x80000001, 31 ); + + TEST_IMM_SRC1_BYPASS( 21, 0, srai, 0xff000000, 0x80000000, 7 ); + TEST_IMM_SRC1_BYPASS( 22, 1, srai, 0xfffe0000, 0x80000000, 14 ); + TEST_IMM_SRC1_BYPASS( 23, 2, srai, 0xffffffff, 0x80000001, 31 ); + + TEST_IMM_ZEROSRC1( 24, srai, 0, 31 ); + TEST_IMM_ZERODEST( 25, srai, 33, 20 ); +# + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/srai.o b/picorv32_firmware/tests/srai.o new file mode 100644 index 0000000000000000000000000000000000000000..87b975b900993a79720aace999df616d7e59d6c3 GIT binary patch literal 2648 zcmb7GO=w(I6h3eMl42a*^d*`mv7MUMM%0iuNtzUjJfUhAK|(?3B9Kg9M_NqNAv24L z3#X(zWeC0?L5mjL2)Za(ji8GGTM!hPM_Lfv1R5cWAOpH`k@%haGjm#S;R)}a?>pz* zbI&{X-Zy#g)tT2E#~~{Y{Y4!{)PF#GCX^bXZt9|`G?AB1(^Q7s73lDTG!5s!g{_aS zwvOyqmW!7;JW6jR*v?PHJf*!EzXrSPNpgo>-V$k}=&%C=x%;Q7b3y|vG4AxAB$^PDn;H{;=sPpuhfUyZ^~ zV%!)lmnoAMW?E4GP!e z!Hy4g{Mu+l^=yxqZF2pGIzFx=xgXVE9`mwWT>sM@pYBCeUs~|8Ev~<>##NS+ZtxM{sT6K^F=Z0uyLwZUVp*C`=@Oj zdQNt2J{#@$gLdt*gZ)WHvv$8~nBR0FauZ%NFnhR)`kGES&`9E}yHR>J71Lr^*VPO_ZA<8~`Z=LKFAxF+zrz;^_03cM?DH}=%#&kKB7;PV1k1zr{S3xR(S z_&3H!u^?ny*i$%X?z7tNGB)ox&3IVb&j|Y*<73)>N!V{NKCbPn!hVM_f50FOVQ&h& zE$|NGyb7mj+_Bt<#xz=a=SsDB0lK=Z^(BjzON&KZ0Y2~-i`62HUch1bACgBbT0&;q z)wlL^`+gI?*jfgm7zditP#4ipn8-(j=d+K$fupIiPn&*lPD0RuJ(sD(LT8Mlohe2zC_y literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/srl.S b/picorv32_firmware/tests/srl.S new file mode 100644 index 0000000..35cc4c7 --- /dev/null +++ b/picorv32_firmware/tests/srl.S @@ -0,0 +1,90 @@ +# See LICENSE for license details. + +#***************************************************************************** +# srl.S +#----------------------------------------------------------------------------- +# +# Test srl instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, srl, 0xffff8000, 0xffff8000, 0 ); + TEST_RR_OP( 3, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_OP( 4, srl, 0x01ffff00, 0xffff8000, 7 ); + TEST_RR_OP( 5, srl, 0x0003fffe, 0xffff8000, 14 ); + TEST_RR_OP( 6, srl, 0x0001ffff, 0xffff8001, 15 ); + + TEST_RR_OP( 7, srl, 0xffffffff, 0xffffffff, 0 ); + TEST_RR_OP( 8, srl, 0x7fffffff, 0xffffffff, 1 ); + TEST_RR_OP( 9, srl, 0x01ffffff, 0xffffffff, 7 ); + TEST_RR_OP( 10, srl, 0x0003ffff, 0xffffffff, 14 ); + TEST_RR_OP( 11, srl, 0x00000001, 0xffffffff, 31 ); + + TEST_RR_OP( 12, srl, 0x21212121, 0x21212121, 0 ); + TEST_RR_OP( 13, srl, 0x10909090, 0x21212121, 1 ); + TEST_RR_OP( 14, srl, 0x00424242, 0x21212121, 7 ); + TEST_RR_OP( 15, srl, 0x00008484, 0x21212121, 14 ); + TEST_RR_OP( 16, srl, 0x00000000, 0x21212121, 31 ); + + # Verify that shifts only use bottom five bits + + TEST_RR_OP( 17, srl, 0x21212121, 0x21212121, 0xffffffe0 ); + TEST_RR_OP( 18, srl, 0x10909090, 0x21212121, 0xffffffe1 ); + TEST_RR_OP( 19, srl, 0x00424242, 0x21212121, 0xffffffe7 ); + TEST_RR_OP( 20, srl, 0x00008484, 0x21212121, 0xffffffee ); + TEST_RR_OP( 21, srl, 0x00000000, 0x21212121, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 22, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_SRC2_EQ_DEST( 23, srl, 0x0003fffe, 0xffff8000, 14 ); + TEST_RR_SRC12_EQ_DEST( 24, srl, 0, 7 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 25, 0, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_DEST_BYPASS( 26, 1, srl, 0x0003fffe, 0xffff8000, 14 ); + TEST_RR_DEST_BYPASS( 27, 2, srl, 0x0001ffff, 0xffff8000, 15 ); + + TEST_RR_SRC12_BYPASS( 28, 0, 0, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_SRC12_BYPASS( 29, 0, 1, srl, 0x01ffff00, 0xffff8000, 7 ); + TEST_RR_SRC12_BYPASS( 30, 0, 2, srl, 0x0001ffff, 0xffff8000, 15 ); + TEST_RR_SRC12_BYPASS( 31, 1, 0, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_SRC12_BYPASS( 32, 1, 1, srl, 0x01ffff00, 0xffff8000, 7 ); + TEST_RR_SRC12_BYPASS( 33, 2, 0, srl, 0x0001ffff, 0xffff8000, 15 ); + + TEST_RR_SRC21_BYPASS( 34, 0, 0, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_SRC21_BYPASS( 35, 0, 1, srl, 0x01ffff00, 0xffff8000, 7 ); + TEST_RR_SRC21_BYPASS( 36, 0, 2, srl, 0x0001ffff, 0xffff8000, 15 ); + TEST_RR_SRC21_BYPASS( 37, 1, 0, srl, 0x7fffc000, 0xffff8000, 1 ); + TEST_RR_SRC21_BYPASS( 38, 1, 1, srl, 0x01ffff00, 0xffff8000, 7 ); + TEST_RR_SRC21_BYPASS( 39, 2, 0, srl, 0x0001ffff, 0xffff8000, 15 ); + + TEST_RR_ZEROSRC1( 40, srl, 0, 15 ); + TEST_RR_ZEROSRC2( 41, srl, 32, 32 ); + TEST_RR_ZEROSRC12( 42, srl, 0 ); + TEST_RR_ZERODEST( 43, srl, 1024, 2048 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/srl.o b/picorv32_firmware/tests/srl.o new file mode 100644 index 0000000000000000000000000000000000000000..347b6bec6f957fd26d5103040600f6cdd0f5c03b GIT binary patch literal 4372 zcmb7IU1$_n6h5;*F}8MGv)bAu=!(`_sv*0xF-eVe{i_zOja8{d!Nf78#i&bmA5tnc zU>}N=5ZoZa1{+!*0xczAt%3Rwkb<=Ff`J_NKNRLVm8P^g%GXYRc-XZ?d-nYrJ0 z&bi;7IdksJ#1oshzhPMxnPJgi6fmOebCoCUO)IFHW>IsLC?1Vca}~u-Vs=kOX=&mI z*cQ;S^5U6XPd62!(;>F;ak+11CJxbyr378>2euRB4wm*QdraAXojDP=8_69iy{GJ1 zWw$9*=(o#pJ45cd(!0txt$h(H^#2LHc5;VHd)Qa#i&5MvYkvs-2k>{We^-IZejWuI z*v^tWVC*^%oBGt6K61~LcB(Zp7uFl#{NGkSnG5?y$UR$nOZmzcUvt4mPWBk*zwL5j z$r9vPz^IBi|pSL_;pS@HsBf?mc{L9_HPdSI(kPz@DA3A#Q1od-&L0PClcL9D7}9DAT5z6SCBZ;n`Q?bNDZ zP1)-~Z_UH&V!Y1u=9uL!ntCNzr}Hv7J#TWFK>nqdgSafQHrJ^le}BIeQJ>OFL44VZ ze`Jk!4JMaq3;S=0zlQU+9?HkBQJM7@SH?ajCr{t(VG2RNu40Y%8@g8Jnk#aOg>e60 z;5D2J_d&%q`}IkLP@e@VF01bGQ|r?hLjG|TU-sjlUY`u-KiA~Kv5(~A*QcHJpELQG z*vIRe`gE}VY?BkmnspV|Tv4Aa*C&eS4LLjgUJs%FVWW^!!v053;F%S2YfIsa?H`}@L#}B3qA!tD)?{UR|LNeepm26!0W>}d4s<`h;|G9FZgl6!^r(x!Jh@67M$O! zb0SKOa6jw7GlDM#&kO!4_^{v(_@v-#z)AGWM(~w_Zv*cTd>8nj;QPQw1$V)(2!0rR zQt%vjeN~WuFZhJ0*C*ij1pgE~A+G-v_+G&W!21M03qB?|_s$)`zXFem>mLQ*B=~pW zy@Fo?9}%2;uPFFc@QAp+pTQdiFM%HtJm^*Af%|t0elubW8uDGa{DGsLN4lsX+r#sL zqg}mupBy@Nw2Qo$6usa1VYkALn$l`&QqyWRHLIybO|5E5HtIR4=aincQc_DLwN_G# zCAC^o%O$m5O6#SxUP|kwv|dW!q|_O6#Sxo}={~t>)z~2izDezr^Bj`t?lMuK?;JpI#{x$JK0*?!PUEse3o{xQQ)}{sCEpS%g&jh|8 z@VLM?8SBE`5%y|417hlrJX*+D*Db@i2?fAt7xr$(tChW1*oPQ5EBmOhPcm*%_FKY! zpE195F{*J>&F`*c{F<`233~_QHOih9_S1~plzm9p#~H6x_G`j^kMZlueqY$@(L1qq z%D#fJuETc58D-xu?0t;aEBk=3Ul4d);A;Zk5%?}+{use%K`+nSs4z9;K01=`Jcv2p zqvj6`>gnq4#N&`3eup~qoz!p;8})yT1Y*%{WL`IX``ZiwMp?X3r*TG68pH?J9Nagg z?5*cG{svpFIb7bz3N1Dmy_LXR)+fbrPCR%iB82tgEl5R&a=CB-ydviqPY zbRj+z3`=l|h=vl-2SFbK{-j_Z0!0uEvP)VJ6kMo6AEYekgNStf&fI%MJ;rgqw#&_CSR>l5G@G82rr^EWQ#$6-_7BY~o-<0p2el`4tU%ii z#lniy@SG_MHfkqzypDK+!peQ*n5AId#LF&)wFc&5n0tV^dCq?#q(-!7=rj;3aQZ35$#b?S_^|fac6w+iEW5qYeP)0w zkN0}c4(A_i&tdQD>n`rC%X6v}T(2Ez&td%$GJrM*v1Fh589#{oZm=(bE|3;T&jFt2>w0zy5M`@JA(fNUKRWaJhUc}#Kd_u?9MErBc`~idA z6!Bew>jMAEI33Ap9Pe1qh{lvDzImyXy8vHW(SFgQmHbi;uK*wTg-c-c^`6AV`S{%Ozj!tmApL{F25b^=3wsXe>L?=13yfLazp~)UqW}N^ literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/sub.S b/picorv32_firmware/tests/sub.S new file mode 100644 index 0000000..ad56e3e --- /dev/null +++ b/picorv32_firmware/tests/sub.S @@ -0,0 +1,83 @@ +# See LICENSE for license details. + +#***************************************************************************** +# sub.S +#----------------------------------------------------------------------------- +# +# Test sub instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Arithmetic tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, sub, 0x00000000, 0x00000000, 0x00000000 ); + TEST_RR_OP( 3, sub, 0x00000000, 0x00000001, 0x00000001 ); + TEST_RR_OP( 4, sub, 0xfffffffc, 0x00000003, 0x00000007 ); + + TEST_RR_OP( 5, sub, 0x00008000, 0x00000000, 0xffff8000 ); + TEST_RR_OP( 6, sub, 0x80000000, 0x80000000, 0x00000000 ); + TEST_RR_OP( 7, sub, 0x80008000, 0x80000000, 0xffff8000 ); + + TEST_RR_OP( 8, sub, 0xffff8001, 0x00000000, 0x00007fff ); + TEST_RR_OP( 9, sub, 0x7fffffff, 0x7fffffff, 0x00000000 ); + TEST_RR_OP( 10, sub, 0x7fff8000, 0x7fffffff, 0x00007fff ); + + TEST_RR_OP( 11, sub, 0x7fff8001, 0x80000000, 0x00007fff ); + TEST_RR_OP( 12, sub, 0x80007fff, 0x7fffffff, 0xffff8000 ); + + TEST_RR_OP( 13, sub, 0x00000001, 0x00000000, 0xffffffff ); + TEST_RR_OP( 14, sub, 0xfffffffe, 0xffffffff, 0x00000001 ); + TEST_RR_OP( 15, sub, 0x00000000, 0xffffffff, 0xffffffff ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 16, sub, 2, 13, 11 ); + TEST_RR_SRC2_EQ_DEST( 17, sub, 3, 14, 11 ); + TEST_RR_SRC12_EQ_DEST( 18, sub, 0, 13 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 19, 0, sub, 2, 13, 11 ); + TEST_RR_DEST_BYPASS( 20, 1, sub, 3, 14, 11 ); + TEST_RR_DEST_BYPASS( 21, 2, sub, 4, 15, 11 ); + + TEST_RR_SRC12_BYPASS( 22, 0, 0, sub, 2, 13, 11 ); + TEST_RR_SRC12_BYPASS( 23, 0, 1, sub, 3, 14, 11 ); + TEST_RR_SRC12_BYPASS( 24, 0, 2, sub, 4, 15, 11 ); + TEST_RR_SRC12_BYPASS( 25, 1, 0, sub, 2, 13, 11 ); + TEST_RR_SRC12_BYPASS( 26, 1, 1, sub, 3, 14, 11 ); + TEST_RR_SRC12_BYPASS( 27, 2, 0, sub, 4, 15, 11 ); + + TEST_RR_SRC21_BYPASS( 28, 0, 0, sub, 2, 13, 11 ); + TEST_RR_SRC21_BYPASS( 29, 0, 1, sub, 3, 14, 11 ); + TEST_RR_SRC21_BYPASS( 30, 0, 2, sub, 4, 15, 11 ); + TEST_RR_SRC21_BYPASS( 31, 1, 0, sub, 2, 13, 11 ); + TEST_RR_SRC21_BYPASS( 32, 1, 1, sub, 3, 14, 11 ); + TEST_RR_SRC21_BYPASS( 33, 2, 0, sub, 4, 15, 11 ); + + TEST_RR_ZEROSRC1( 34, sub, 15, -15 ); + TEST_RR_ZEROSRC2( 35, sub, 32, 32 ); + TEST_RR_ZEROSRC12( 36, sub, 0 ); + TEST_RR_ZERODEST( 37, sub, 16, 30 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/sub.o b/picorv32_firmware/tests/sub.o new file mode 100644 index 0000000000000000000000000000000000000000..f6beb12292f5008cb78a9299a7bd0623f69655aa GIT binary patch literal 3904 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 literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/test_macros.h b/picorv32_firmware/tests/test_macros.h new file mode 100644 index 0000000..05ed7c8 --- /dev/null +++ b/picorv32_firmware/tests/test_macros.h @@ -0,0 +1,585 @@ +// See LICENSE for license details. + +#ifndef __TEST_MACROS_SCALAR_H +#define __TEST_MACROS_SCALAR_H + + +#----------------------------------------------------------------------- +# Helper macros +#----------------------------------------------------------------------- + +#define TEST_CASE( testnum, testreg, correctval, code... ) \ +test_ ## testnum: \ + code; \ + li x29, correctval; \ + li TESTNUM, testnum; \ + bne testreg, x29, fail; + +# We use a macro hack to simpify code generation for various numbers +# of bubble cycles. + +#define TEST_INSERT_NOPS_0 +#define TEST_INSERT_NOPS_1 nop; TEST_INSERT_NOPS_0 +#define TEST_INSERT_NOPS_2 nop; TEST_INSERT_NOPS_1 +#define TEST_INSERT_NOPS_3 nop; TEST_INSERT_NOPS_2 +#define TEST_INSERT_NOPS_4 nop; TEST_INSERT_NOPS_3 +#define TEST_INSERT_NOPS_5 nop; TEST_INSERT_NOPS_4 +#define TEST_INSERT_NOPS_6 nop; TEST_INSERT_NOPS_5 +#define TEST_INSERT_NOPS_7 nop; TEST_INSERT_NOPS_6 +#define TEST_INSERT_NOPS_8 nop; TEST_INSERT_NOPS_7 +#define TEST_INSERT_NOPS_9 nop; TEST_INSERT_NOPS_8 +#define TEST_INSERT_NOPS_10 nop; TEST_INSERT_NOPS_9 + + +#----------------------------------------------------------------------- +# RV64UI MACROS +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# Tests for instructions with immediate operand +#----------------------------------------------------------------------- + +#define SEXT_IMM(x) ((x) | (-(((x) >> 11) & 1) << 11)) + +#define TEST_IMM_OP( testnum, inst, result, val1, imm ) \ + TEST_CASE( testnum, x3, result, \ + li x1, val1; \ + inst x3, x1, SEXT_IMM(imm); \ + ) + +#define TEST_IMM_SRC1_EQ_DEST( testnum, inst, result, val1, imm ) \ + TEST_CASE( testnum, x1, result, \ + li x1, val1; \ + inst x1, x1, SEXT_IMM(imm); \ + ) + +#define TEST_IMM_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \ + TEST_CASE( testnum, x6, result, \ + li x4, 0; \ +1: li x1, val1; \ + inst x3, x1, SEXT_IMM(imm); \ + TEST_INSERT_NOPS_ ## nop_cycles \ + addi x6, x3, 0; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#define TEST_IMM_SRC1_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \ + TEST_CASE( testnum, x3, result, \ + li x4, 0; \ +1: li x1, val1; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + inst x3, x1, SEXT_IMM(imm); \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#define TEST_IMM_ZEROSRC1( testnum, inst, result, imm ) \ + TEST_CASE( testnum, x1, result, \ + inst x1, x0, SEXT_IMM(imm); \ + ) + +#define TEST_IMM_ZERODEST( testnum, inst, val1, imm ) \ + TEST_CASE( testnum, x0, 0, \ + li x1, val1; \ + inst x0, x1, SEXT_IMM(imm); \ + ) + +#----------------------------------------------------------------------- +# Tests for vector config instructions +#----------------------------------------------------------------------- + +#define TEST_VSETCFGIVL( testnum, nxpr, nfpr, bank, vl, result ) \ + TEST_CASE( testnum, x1, result, \ + li x1, (bank << 12); \ + vsetcfg x1,nxpr,nfpr; \ + li x1, vl; \ + vsetvl x1,x1; \ + ) + +#define TEST_VVCFG( testnum, nxpr, nfpr, bank, vl, result ) \ + TEST_CASE( testnum, x1, result, \ + li x1, (bank << 12) | (nfpr << 6) | nxpr; \ + vsetcfg x1; \ + li x1, vl; \ + vsetvl x1,x1; \ + ) + +#define TEST_VSETVL( testnum, nxpr, nfpr, bank, vl, result ) \ + TEST_CASE( testnum, x1, result, \ + li x1, (bank << 12); \ + vsetcfg x1,nxpr,nfpr; \ + li x1, vl; \ + vsetvl x1, x1; \ + ) + +#----------------------------------------------------------------------- +# Tests for an instruction with register operands +#----------------------------------------------------------------------- + +#define TEST_R_OP( testnum, inst, result, val1 ) \ + TEST_CASE( testnum, x3, result, \ + li x1, val1; \ + inst x3, x1; \ + ) + +#define TEST_R_SRC1_EQ_DEST( testnum, inst, result, val1 ) \ + TEST_CASE( testnum, x1, result, \ + li x1, val1; \ + inst x1, x1; \ + ) + +#define TEST_R_DEST_BYPASS( testnum, nop_cycles, inst, result, val1 ) \ + TEST_CASE( testnum, x6, result, \ + li x4, 0; \ +1: li x1, val1; \ + inst x3, x1; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + addi x6, x3, 0; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#----------------------------------------------------------------------- +# Tests for an instruction with register-register operands +#----------------------------------------------------------------------- + +#define TEST_RR_OP( testnum, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x3, result, \ + li x1, val1; \ + li x2, val2; \ + inst x3, x1, x2; \ + ) + +#define TEST_RR_SRC1_EQ_DEST( testnum, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x1, result, \ + li x1, val1; \ + li x2, val2; \ + inst x1, x1, x2; \ + ) + +#define TEST_RR_SRC2_EQ_DEST( testnum, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x2, result, \ + li x1, val1; \ + li x2, val2; \ + inst x2, x1, x2; \ + ) + +#define TEST_RR_SRC12_EQ_DEST( testnum, inst, result, val1 ) \ + TEST_CASE( testnum, x1, result, \ + li x1, val1; \ + inst x1, x1, x1; \ + ) + +#define TEST_RR_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x6, result, \ + li x4, 0; \ +1: li x1, val1; \ + li x2, val2; \ + inst x3, x1, x2; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + addi x6, x3, 0; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#define TEST_RR_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x3, result, \ + li x4, 0; \ +1: li x1, val1; \ + TEST_INSERT_NOPS_ ## src1_nops \ + li x2, val2; \ + TEST_INSERT_NOPS_ ## src2_nops \ + inst x3, x1, x2; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#define TEST_RR_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \ + TEST_CASE( testnum, x3, result, \ + li x4, 0; \ +1: li x2, val2; \ + TEST_INSERT_NOPS_ ## src1_nops \ + li x1, val1; \ + TEST_INSERT_NOPS_ ## src2_nops \ + inst x3, x1, x2; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + ) + +#define TEST_RR_ZEROSRC1( testnum, inst, result, val ) \ + TEST_CASE( testnum, x2, result, \ + li x1, val; \ + inst x2, x0, x1; \ + ) + +#define TEST_RR_ZEROSRC2( testnum, inst, result, val ) \ + TEST_CASE( testnum, x2, result, \ + li x1, val; \ + inst x2, x1, x0; \ + ) + +#define TEST_RR_ZEROSRC12( testnum, inst, result ) \ + TEST_CASE( testnum, x1, result, \ + inst x1, x0, x0; \ + ) + +#define TEST_RR_ZERODEST( testnum, inst, val1, val2 ) \ + TEST_CASE( testnum, x0, 0, \ + li x1, val1; \ + li x2, val2; \ + inst x0, x1, x2; \ + ) + +#----------------------------------------------------------------------- +# Test memory instructions +#----------------------------------------------------------------------- + +#define TEST_LD_OP( testnum, inst, result, offset, base ) \ + TEST_CASE( testnum, x3, result, \ + la x1, base; \ + inst x3, offset(x1); \ + ) + +#define TEST_ST_OP( testnum, load_inst, store_inst, result, offset, base ) \ + TEST_CASE( testnum, x3, result, \ + la x1, base; \ + li x2, result; \ + store_inst x2, offset(x1); \ + load_inst x3, offset(x1); \ + ) + +#define TEST_LD_DEST_BYPASS( testnum, nop_cycles, inst, result, offset, base ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: la x1, base; \ + inst x3, offset(x1); \ + TEST_INSERT_NOPS_ ## nop_cycles \ + addi x6, x3, 0; \ + li x29, result; \ + bne x6, x29, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b; \ + +#define TEST_LD_SRC1_BYPASS( testnum, nop_cycles, inst, result, offset, base ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: la x1, base; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + inst x3, offset(x1); \ + li x29, result; \ + bne x3, x29, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#define TEST_ST_SRC12_BYPASS( testnum, src1_nops, src2_nops, load_inst, store_inst, result, offset, base ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: li x1, result; \ + TEST_INSERT_NOPS_ ## src1_nops \ + la x2, base; \ + TEST_INSERT_NOPS_ ## src2_nops \ + store_inst x1, offset(x2); \ + load_inst x3, offset(x2); \ + li x29, result; \ + bne x3, x29, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#define TEST_ST_SRC21_BYPASS( testnum, src1_nops, src2_nops, load_inst, store_inst, result, offset, base ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: la x2, base; \ + TEST_INSERT_NOPS_ ## src1_nops \ + li x1, result; \ + TEST_INSERT_NOPS_ ## src2_nops \ + store_inst x1, offset(x2); \ + load_inst x3, offset(x2); \ + li x29, result; \ + bne x3, x29, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#----------------------------------------------------------------------- +# Test branch instructions +#----------------------------------------------------------------------- + +#define TEST_BR1_OP_TAKEN( testnum, inst, val1 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x1, val1; \ + inst x1, 2f; \ + bne x0, TESTNUM, fail; \ +1: bne x0, TESTNUM, 3f; \ +2: inst x1, 1b; \ + bne x0, TESTNUM, fail; \ +3: + +#define TEST_BR1_OP_NOTTAKEN( testnum, inst, val1 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x1, val1; \ + inst x1, 1f; \ + bne x0, TESTNUM, 2f; \ +1: bne x0, TESTNUM, fail; \ +2: inst x1, 1b; \ +3: + +#define TEST_BR1_SRC1_BYPASS( testnum, nop_cycles, inst, val1 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: li x1, val1; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + inst x1, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#define TEST_BR2_OP_TAKEN( testnum, inst, val1, val2 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x1, val1; \ + li x2, val2; \ + inst x1, x2, 2f; \ + bne x0, TESTNUM, fail; \ +1: bne x0, TESTNUM, 3f; \ +2: inst x1, x2, 1b; \ + bne x0, TESTNUM, fail; \ +3: + +#define TEST_BR2_OP_NOTTAKEN( testnum, inst, val1, val2 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x1, val1; \ + li x2, val2; \ + inst x1, x2, 1f; \ + bne x0, TESTNUM, 2f; \ +1: bne x0, TESTNUM, fail; \ +2: inst x1, x2, 1b; \ +3: + +#define TEST_BR2_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: li x1, val1; \ + TEST_INSERT_NOPS_ ## src1_nops \ + li x2, val2; \ + TEST_INSERT_NOPS_ ## src2_nops \ + inst x1, x2, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#define TEST_BR2_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: li x2, val2; \ + TEST_INSERT_NOPS_ ## src1_nops \ + li x1, val1; \ + TEST_INSERT_NOPS_ ## src2_nops \ + inst x1, x2, fail; \ + addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#----------------------------------------------------------------------- +# Test jump instructions +#----------------------------------------------------------------------- + +#define TEST_JR_SRC1_BYPASS( testnum, nop_cycles, inst ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: la x6, 2f; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + inst x6; \ + bne x0, TESTNUM, fail; \ +2: addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + +#define TEST_JALR_SRC1_BYPASS( testnum, nop_cycles, inst ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + li x4, 0; \ +1: la x6, 2f; \ + TEST_INSERT_NOPS_ ## nop_cycles \ + inst x19, x6, 0; \ + bne x0, TESTNUM, fail; \ +2: addi x4, x4, 1; \ + li x5, 2; \ + bne x4, x5, 1b \ + + +#----------------------------------------------------------------------- +# RV64UF MACROS +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# Tests floating-point instructions +#----------------------------------------------------------------------- + +#define TEST_FP_OP_S_INTERNAL( testnum, flags, result, val1, val2, val3, code... ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + la a0, test_ ## testnum ## _data ;\ + flw f0, 0(a0); \ + flw f1, 4(a0); \ + flw f2, 8(a0); \ + lw a3, 12(a0); \ + code; \ + fsflags a1, x0; \ + li a2, flags; \ + bne a0, a3, fail; \ + bne a1, a2, fail; \ + j 2f; \ + .align 2; \ + .data; \ + test_ ## testnum ## _data: \ + .float val1; \ + .float val2; \ + .float val3; \ + .result; \ + .text; \ +2: + +#define TEST_FP_OP_D_INTERNAL( testnum, flags, result, val1, val2, val3, code... ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + la a0, test_ ## testnum ## _data ;\ + fld f0, 0(a0); \ + fld f1, 8(a0); \ + fld f2, 16(a0); \ + ld a3, 24(a0); \ + code; \ + fsflags a1, x0; \ + li a2, flags; \ + bne a0, a3, fail; \ + bne a1, a2, fail; \ + j 2f; \ + .data; \ + .align 3; \ + test_ ## testnum ## _data: \ + .double val1; \ + .double val2; \ + .double val3; \ + .result; \ + .text; \ +2: + +#define TEST_FCVT_S_D( testnum, result, val1 ) \ + TEST_FP_OP_D_INTERNAL( testnum, 0, double result, val1, 0.0, 0.0, \ + fcvt.s.d f3, f0; fcvt.d.s f3, f3; fmv.x.d a0, f3) + +#define TEST_FCVT_D_S( testnum, result, val1 ) \ + TEST_FP_OP_S_INTERNAL( testnum, 0, float result, val1, 0.0, 0.0, \ + fcvt.d.s f3, f0; fcvt.s.d f3, f3; fmv.x.s a0, f3) + +#define TEST_FP_OP1_S( testnum, inst, flags, result, val1 ) \ + TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, 0.0, 0.0, \ + inst f3, f0; fmv.x.s a0, f3) + +#define TEST_FP_OP1_D( testnum, inst, flags, result, val1 ) \ + TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, 0.0, 0.0, \ + inst f3, f0; fmv.x.d a0, f3) + +#define TEST_FP_OP2_S( testnum, inst, flags, result, val1, val2 ) \ + TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, val2, 0.0, \ + inst f3, f0, f1; fmv.x.s a0, f3) + +#define TEST_FP_OP2_D( testnum, inst, flags, result, val1, val2 ) \ + TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, val2, 0.0, \ + inst f3, f0, f1; fmv.x.d a0, f3) + +#define TEST_FP_OP3_S( testnum, inst, flags, result, val1, val2, val3 ) \ + TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, val2, val3, \ + inst f3, f0, f1, f2; fmv.x.s a0, f3) + +#define TEST_FP_OP3_D( testnum, inst, flags, result, val1, val2, val3 ) \ + TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, val2, val3, \ + inst f3, f0, f1, f2; fmv.x.d a0, f3) + +#define TEST_FP_INT_OP_S( testnum, inst, flags, result, val1, rm ) \ + TEST_FP_OP_S_INTERNAL( testnum, flags, word result, val1, 0.0, 0.0, \ + inst a0, f0, rm) + +#define TEST_FP_INT_OP_D( testnum, inst, flags, result, val1, rm ) \ + TEST_FP_OP_D_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \ + inst a0, f0, rm) + +#define TEST_FP_CMP_OP_S( testnum, inst, result, val1, val2 ) \ + TEST_FP_OP_S_INTERNAL( testnum, 0, word result, val1, val2, 0.0, \ + inst a0, f0, f1) + +#define TEST_FP_CMP_OP_D( testnum, inst, result, val1, val2 ) \ + TEST_FP_OP_D_INTERNAL( testnum, 0, dword result, val1, val2, 0.0, \ + inst a0, f0, f1) + +#define TEST_INT_FP_OP_S( testnum, inst, result, val1 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + la a0, test_ ## testnum ## _data ;\ + lw a3, 0(a0); \ + li a0, val1; \ + inst f0, a0; \ + fsflags x0; \ + fmv.x.s a0, f0; \ + bne a0, a3, fail; \ + j 1f; \ + .align 2; \ + test_ ## testnum ## _data: \ + .float result; \ +1: + +#define TEST_INT_FP_OP_D( testnum, inst, result, val1 ) \ +test_ ## testnum: \ + li TESTNUM, testnum; \ + la a0, test_ ## testnum ## _data ;\ + ld a3, 0(a0); \ + li a0, val1; \ + inst f0, a0; \ + fsflags x0; \ + fmv.x.d a0, f0; \ + bne a0, a3, fail; \ + j 1f; \ + .align 3; \ + test_ ## testnum ## _data: \ + .double result; \ +1: + +#----------------------------------------------------------------------- +# Pass and fail code (assumes test num is in TESTNUM) +#----------------------------------------------------------------------- + +#define TEST_PASSFAIL \ + bne x0, TESTNUM, pass; \ +fail: \ + RVTEST_FAIL; \ +pass: \ + RVTEST_PASS \ + + +#----------------------------------------------------------------------- +# Test data section +#----------------------------------------------------------------------- + +#define TEST_DATA + +#endif diff --git a/picorv32_firmware/tests/xor.S b/picorv32_firmware/tests/xor.S new file mode 100644 index 0000000..72875fe --- /dev/null +++ b/picorv32_firmware/tests/xor.S @@ -0,0 +1,69 @@ +# See LICENSE for license details. + +#***************************************************************************** +# xor.S +#----------------------------------------------------------------------------- +# +# Test xor instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Logical tests + #------------------------------------------------------------- + + TEST_RR_OP( 2, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_OP( 3, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_OP( 4, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_OP( 5, xor, 0x00ff00ff, 0xf00ff00f, 0xf0f0f0f0 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_RR_SRC1_EQ_DEST( 6, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC2_EQ_DEST( 7, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_EQ_DEST( 8, xor, 0x00000000, 0xff00ff00 ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_RR_DEST_BYPASS( 9, 0, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_DEST_BYPASS( 10, 1, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_DEST_BYPASS( 11, 2, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_SRC12_BYPASS( 12, 0, 0, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 13, 0, 1, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC12_BYPASS( 14, 0, 2, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 15, 1, 0, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC12_BYPASS( 16, 1, 1, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC12_BYPASS( 17, 2, 0, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_SRC21_BYPASS( 18, 0, 0, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 19, 0, 1, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC21_BYPASS( 20, 0, 2, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 21, 1, 0, xor, 0xf00ff00f, 0xff00ff00, 0x0f0f0f0f ); + TEST_RR_SRC21_BYPASS( 22, 1, 1, xor, 0xff00ff00, 0x0ff00ff0, 0xf0f0f0f0 ); + TEST_RR_SRC21_BYPASS( 23, 2, 0, xor, 0x0ff00ff0, 0x00ff00ff, 0x0f0f0f0f ); + + TEST_RR_ZEROSRC1( 24, xor, 0xff00ff00, 0xff00ff00 ); + TEST_RR_ZEROSRC2( 25, xor, 0x00ff00ff, 0x00ff00ff ); + TEST_RR_ZEROSRC12( 26, xor, 0 ); + TEST_RR_ZERODEST( 27, xor, 0x11111111, 0x22222222 ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/xor.o b/picorv32_firmware/tests/xor.o new file mode 100644 index 0000000000000000000000000000000000000000..23bef9d21efc5e55b07150569d4cf562fd80da48 GIT binary patch literal 3544 zcmb7HO=w(I6h1eZNn;H&Z~AQMPps24wb90D-b~VIpyHIaRy0T~6(~CKt(hoZM~A*8-cxx<%ClYLciRe&bcUh1OlOJ*CKQ z*+SKpG(E6REv?jGhTPq^2YtVF>R_Yx5#QaX{;h?znJ3q}o!9SNTOZ$dwSOo4!@4c7 ze{RE^gM7EheCy)NMqKDI{RrF$XBcjLMi6zXG3U-nry*GSI}^ZJr9SKrU{@0xrgbv>)l zKhLgyr+%-_d*gh^l{?$q6y%pXYSBs^D$3p2j0g8b?iSXO2+sbDayy%?iv==gbsqUQ zT5DD+RjpX5{GP5ZTkYw};V#f;c|p0)H4v}fiu=y0#)o5eTRL8C^J4aCg`zCr>43t25O`AX0`Q#RCxPpNzYYAS;O_#rhaV9|XTZ~fyWsB$ z{vr5P!AszG1pgSk9p^|7MNrJdJOx9*UjwO1& zNbr^3fF1gAWv$FHGUc&SdE`>@;uvMdCs>YL8k;PKWc2c-G4gG)^nUS!3mWIN=+|OE zi$hxEwK%NBpcYP_k&cmBBTXd7gmO$Q#{_dsG{=Np4+Jz760^z)2g z()tCV|AX<%TK`b!x8p2W2eiJ2v8m4x<6f;lBlK4o^QDb(Rp{%CGg{ve`lpN!YJEF4 zDTv?C*n9|%3;j4_N849~eoo-)0{zorqfDthq2>7i zO^jVA;yCl+9W9oNlsSh+{~sd_TWlkl)+7FZN+G;Eb-zMIyYL`AD&XOfA{Hyyjt6fOZ`($89D@f-ye1qRuK*{`m%qClkI&9Cc!F4fbPd5r UgCO7mOs%pTMbc*L*e$gC595e);s5{u literal 0 HcmV?d00001 diff --git a/picorv32_firmware/tests/xori.S b/picorv32_firmware/tests/xori.S new file mode 100644 index 0000000..7f2207c --- /dev/null +++ b/picorv32_firmware/tests/xori.S @@ -0,0 +1,55 @@ +# See LICENSE for license details. + +#***************************************************************************** +# xori.S +#----------------------------------------------------------------------------- +# +# Test xori instruction. +# + +#include "riscv_test.h" +#include "test_macros.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + #------------------------------------------------------------- + # Logical tests + #------------------------------------------------------------- + + TEST_IMM_OP( 2, xori, 0xff00f00f, 0x00ff0f00, 0xf0f ); + TEST_IMM_OP( 3, xori, 0x0ff00f00, 0x0ff00ff0, 0x0f0 ); + TEST_IMM_OP( 4, xori, 0x00ff0ff0, 0x00ff08ff, 0x70f ); + TEST_IMM_OP( 5, xori, 0xf00ff0ff, 0xf00ff00f, 0x0f0 ); + + #------------------------------------------------------------- + # Source/Destination tests + #------------------------------------------------------------- + + TEST_IMM_SRC1_EQ_DEST( 6, xori, 0xff00f00f, 0xff00f700, 0x70f ); + + #------------------------------------------------------------- + # Bypassing tests + #------------------------------------------------------------- + + TEST_IMM_DEST_BYPASS( 7, 0, xori, 0x0ff00f00, 0x0ff00ff0, 0x0f0 ); + TEST_IMM_DEST_BYPASS( 8, 1, xori, 0x00ff0ff0, 0x00ff08ff, 0x70f ); + TEST_IMM_DEST_BYPASS( 9, 2, xori, 0xf00ff0ff, 0xf00ff00f, 0x0f0 ); + + TEST_IMM_SRC1_BYPASS( 10, 0, xori, 0x0ff00f00, 0x0ff00ff0, 0x0f0 ); + TEST_IMM_SRC1_BYPASS( 11, 1, xori, 0x00ff0ff0, 0x00ff0fff, 0x00f ); + TEST_IMM_SRC1_BYPASS( 12, 2, xori, 0xf00ff0ff, 0xf00ff00f, 0x0f0 ); + + TEST_IMM_ZEROSRC1( 13, xori, 0x0f0, 0x0f0 ); + TEST_IMM_ZERODEST( 14, xori, 0x00ff00ff, 0x70f ); + + TEST_PASSFAIL + +RVTEST_CODE_END + + .data +RVTEST_DATA_BEGIN + + TEST_DATA + +RVTEST_DATA_END diff --git a/picorv32_firmware/tests/xori.o b/picorv32_firmware/tests/xori.o new file mode 100644 index 0000000000000000000000000000000000000000..c410201b1d06f5fe50c04082691685fc0cc90903 GIT binary patch literal 2040 zcmb7EO=wd=5T2L6TF~Ux*H&$<1{CQ*gK4YPTMqsmiWEWcAk_F8so0;8jS( z79WU6ks=;ENe|Uj@K8nX4Mk88EQsL2!vj5dki>6x-=@<_4^G&f@0*>OH@iF8TPOQY zS(ZgcEc!`njA${YS9+A{q%G7yy-^}38l~PC*^|)j-6-u#zJ#rX#{9jt@v*{HcK4#I zA-3}<+cokg$oJm(ez{6DZ@NlOJW1|@N=MoD6IiQxZzxgT13Vq~o%msLA6D9RoPQ5- z`SKp*n2y(+c!u0Zm0e{&;d>K4skkcebT#3``^lZH>?r%lH$i!C332uBT_X4Ka*Gop z)U)xw}^qDn`_&Vm8Lv zh^yBbq?r@dd=4H!mTMDBuY%kg$abn4+7xN=d!yNAZ1;+be zd&JnI1d9>bO?v!+}l*x+~B@rgRVGv&AB%`qH7an!D88t>zvzA5rsBQg0hi1BF~E z*iTy|08rflWK(-!XJzcXZ##HXcLO)!EoJG$u(v2kLjq3;JSXsLfj={D#RU0*Ve;6x z3wwt$Q<8Cz{|w`u+I~UUON{wX0hto^r;OXQeL>hiGH%!Q@526DU>p5rzT3>WMf(o| zH+5)Csp9pKQuZ=*si5_cL519K7Hz^!F_w_44+?)Av4i?rj1?O9Zk?ZCD;O}zJ dG-8-sfOHcJZy5w)@-=}=zbPb28z*Sv_ZN^IOS%96 literal 0 HcmV?d00001