diff options
-rw-r--r-- | debug/Makefile.am | 3 | ||||
-rw-r--r-- | debug/testfilegen-arm64.c | 116 |
2 files changed, 118 insertions, 1 deletions
diff --git a/debug/Makefile.am b/debug/Makefile.am index 7295ee61..db6f47f7 100644 --- a/debug/Makefile.am +++ b/debug/Makefile.am @@ -11,7 +11,8 @@ noinst_PROGRAMS = \ memusage \ crc32 \ known_sizes \ - hex2bin + hex2bin \ + testfilegen-arm64 AM_CPPFLAGS = \ -I$(top_srcdir)/src/common \ diff --git a/debug/testfilegen-arm64.c b/debug/testfilegen-arm64.c new file mode 100644 index 00000000..88cadcaa --- /dev/null +++ b/debug/testfilegen-arm64.c @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: 0BSD + +/////////////////////////////////////////////////////////////////////////////// +// +/// \file testfilegen-arm64.c +/// \brief Generates uncompressed test file for the ARM64 filter +// +// Author: Lasse Collin +// +/////////////////////////////////////////////////////////////////////////////// + +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> + + +static uint32_t pc4 = 0; + + +static void +put32le(uint32_t v) +{ + putchar((v >> 0) & 0xFF); + putchar((v >> 8) & 0xFF); + putchar((v >> 16) & 0xFF); + putchar((v >> 24) & 0xFF); + ++pc4; +} + + +static void +putbl(uint32_t imm) +{ + imm &= (1U << 26) - 1; + imm |= 0x25U << 26; + put32le(imm); +} + + +static void +putadrp32(uint32_t imm) +{ + imm &= 0x1FFFFFU; + + // fprintf(stderr, "ADRP 0x%08X\n", imm); + + uint32_t instr = 0x90000000; + instr |= (pc4 * 5 + 11) & 0x1F; + instr |= (imm & 3) << 29; + instr |= (imm >> 2) << 5; + + put32le(instr); +} + + +extern int +main(void) +{ + putbl(0); + putbl(0x03FFFFFF); + putbl(0x03FFFFFE); + putbl(0x03FFFFFD); + + putbl(3); + putbl(2); + putbl(1); + putbl(0); + + + putbl(0x02000001); + putbl(0x02000000); + putbl(0x01FFFFFF); + putbl(0x01FFFFFE); + + putbl(0x01111117); + putbl(0x01111116); + putbl(0x01111115); + putbl(0x01111114); + + + putbl(0x02222227); + putbl(0x02222226); + putbl(0x02222225); + putbl(0x02222224); + + putbl(0U - pc4); + putbl(0U - pc4); + putbl(0U - pc4); + putbl(0U - pc4); + + putadrp32(0x00); + putadrp32(0x05); + putadrp32(0x15); + putadrp32(0x25); + + for (unsigned rep = 0; rep < 2; ++rep) { + while ((pc4 << 2) & 4095) + put32le(0x55555555U); + + for (unsigned i = 10; i <= 21; ++i) { + const uint32_t neg = (0x1FFF00 >> (21 - i)) & ~255U; + const uint32_t plus = 1U << (i - 1); + putadrp32(0x000000 | plus); + putadrp32(0x000005 | plus); + putadrp32(0x0000FE | plus); + putadrp32(0x0000FF | plus); + + putadrp32(0x000000 | neg); + putadrp32(0x000005 | neg); + putadrp32(0x0000FE | neg); + putadrp32(0x0000FF | neg); + } + } + + return 0; +} |