blob: 04cb13791b561bfc3c0923f5de7b4f69077180c5 [file] [log] [blame]
Maciej Żenczykowski090fb742024-01-19 12:12:07 -08001 @Test
2 public void testFullApfV4ProgramGeneration() throws IllegalInstructionException {
3 ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -08004 gen.addLoadImmediate(R1, -8);
Maciej Żenczykowski090fb742024-01-19 12:12:07 -08005 gen.addLoadData(R0, 0);
6 gen.addAdd(1);
7 gen.addStoreData(R0, 0);
8 gen.addLoad16(R0, 12);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -08009 gen.addLoadImmediate(R1, -120);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080010 gen.addJumpIfR0LessThan(0x600, "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080011 gen.addLoadImmediate(R1, -124);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080012 gen.addJumpIfR0Equals(0x88a2, "LABEL_INC_AND_DROP");
13 gen.addJumpIfR0Equals(0x88a4, "LABEL_INC_AND_DROP");
14 gen.addJumpIfR0Equals(0x88b8, "LABEL_INC_AND_DROP");
15 gen.addJumpIfR0Equals(0x88cd, "LABEL_INC_AND_DROP");
16 gen.addJumpIfR0Equals(0x88e1, "LABEL_INC_AND_DROP");
17 gen.addJumpIfR0Equals(0x88e3, "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080018 gen.addJumpIfR0NotEquals(0x806, "LABEL_122");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080019 gen.addLoadImmediate(R0, 14);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080020 gen.addLoadImmediate(R1, -152);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080021 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080022 gen.addLoad16(R0, 20);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080023 gen.addJumpIfR0Equals(0x1, "LABEL_104");
24 gen.addLoadImmediate(R1, -156);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080025 gen.addJumpIfR0NotEquals(0x2, "LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080026 gen.addLoad32(R0, 28);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080027 gen.addLoadImmediate(R1, -128);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080028 gen.addJumpIfR0Equals(0x0, "LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080029 gen.addLoadImmediate(R0, 0);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080030 gen.addLoadImmediate(R1, -56);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080031 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_INC_AND_PASS");
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -080032
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080033 gen.defineLabel("LABEL_104");
Maciej Żenczykowski4b310b12024-01-22 12:28:12 -080034 gen.addLoadImmediate(R0, 38);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080035 gen.addLoadImmediate(R1, -80);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080036 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("c0a801ec"), "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080037 gen.addLoadImmediate(R1, -20);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080038 gen.addJump("LABEL_INC_AND_PASS");
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -080039
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080040 gen.defineLabel("LABEL_122");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080041 gen.addLoad16(R0, 12);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080042 gen.addJumpIfR0NotEquals(0x800, "LABEL_249");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080043 gen.addLoad8(R0, 23);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080044 gen.addJumpIfR0NotEquals(0x11, "LABEL_165");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080045 gen.addLoad16(R0, 20);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080046 gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_165");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080047 gen.addLoadFromMemory(R1, 13);
48 gen.addLoad16Indexed(R0, 16);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080049 gen.addJumpIfR0NotEquals(0x44, "LABEL_165");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080050 gen.addLoadImmediate(R0, 50);
51 gen.addAddR1();
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080052 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("7e9046bc7008"), "LABEL_165");
53 gen.addLoadImmediate(R1, -24);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080054 gen.addJump("LABEL_INC_AND_PASS");
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -080055
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080056 gen.defineLabel("LABEL_165");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080057 gen.addLoad8(R0, 30);
58 gen.addAnd(240);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080059 gen.addLoadImmediate(R1, -96);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080060 gen.addJumpIfR0Equals(0xe0, "LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080061 gen.addLoadImmediate(R1, -88);
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080062 gen.addLoad32(R0, 30);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080063 gen.addJumpIfR0Equals(0xffffffff, "LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080064 gen.addLoadImmediate(R1, -92);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080065 gen.addJumpIfR0Equals(0xc0a801ff, "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080066 gen.addLoad8(R0, 23);
67 gen.addJumpIfR0NotEquals(0x6, "LABEL_225");
68 gen.addLoad16(R0, 20);
69 gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_225");
70 gen.addLoadFromMemory(R1, 13);
71 gen.addLoad16Indexed(R0, 16);
72 gen.addJumpIfR0NotEquals(0x7, "LABEL_225");
73 gen.addLoadImmediate(R1, -148);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080074 gen.addJump("LABEL_INC_AND_DROP");
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -080075
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080076 gen.defineLabel("LABEL_225");
77 gen.addLoadImmediate(R1, -36);
78 gen.addLoadImmediate(R0, 0);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080079 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_INC_AND_PASS");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080080 gen.addLoadImmediate(R1, -84);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080081 gen.addJump("LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -080082 gen.addLoadImmediate(R1, -28);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080083 gen.addJump("LABEL_INC_AND_PASS");
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -080084
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080085 gen.defineLabel("LABEL_249");
86 gen.addJumpIfR0Equals(0x86dd, "LABEL_273");
87 gen.addLoadImmediate(R0, 0);
88 gen.addLoadImmediate(R1, -60);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080089 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_INC_AND_PASS");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080090 gen.addLoadImmediate(R1, -68);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080091 gen.addJump("LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080092
93 gen.defineLabel("LABEL_273");
94 gen.addLoad8(R0, 20);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080095 gen.addJumpIfR0Equals(0x0, "LABEL_INC_AND_PASS");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -080096 gen.addJumpIfR0Equals(0x3a, "LABEL_297");
97 gen.addLoadImmediate(R1, -116);
98 gen.addLoad8(R0, 38);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -080099 gen.addJumpIfR0Equals(0xff, "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800100 gen.addLoadImmediate(R1, -44);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800101 gen.addJump("LABEL_INC_AND_PASS");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800102
103 gen.defineLabel("LABEL_297");
104 gen.addLoad8(R0, 54);
105 gen.addLoadImmediate(R1, -100);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800106 gen.addJumpIfR0Equals(0x85, "LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800107 gen.addJumpIfR0NotEquals(0x88, "LABEL_333");
108 gen.addLoadImmediate(R0, 38);
109 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_333");
110 gen.addLoadImmediate(R1, -104);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800111 gen.addJump("LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800112
113 gen.defineLabel("LABEL_333");
114 gen.addLoadFromMemory(R0, 14);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800115 gen.addJumpIfR0NotEquals(0x96, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800116 gen.addLoadFromMemory(R0, 15);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800117 gen.addJumpIfR0GreaterThan(0x48e, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800118 gen.addLoadImmediate(R0, 0);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800119 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("7e9046bc700828c68e23672c86dd60"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800120 gen.addLoadImmediate(R0, 18);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800121 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("00603afffe800000000000002ac68efffe23672c"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800122 gen.addLoadImmediate(R0, 54);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800123 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("8600"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800124 gen.addLoadImmediate(R0, 58);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800125 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("40c0"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800126 gen.addLoad16(R0, 60);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800127 gen.addJumpIfR0LessThan(0x91e, "LABEL_UNSOLICITED_MULTICAST_NA");
128 gen.addJumpIfR0GreaterThan(0x1b58, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800129 gen.addLoadImmediate(R0, 62);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800130 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("0000000000000000010128c68e23672c05010000000005dc030440c0"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800131 gen.addLoad32(R0, 90);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800132 gen.addJumpIfR0LessThan(0x55555555, "LABEL_UNSOLICITED_MULTICAST_NA");
133 gen.addJumpIfR0GreaterThan(0xffffffffL, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800134 gen.addLoad32(R0, 94);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800135 gen.addJumpIfR0LessThan(0x55555555, "LABEL_UNSOLICITED_MULTICAST_NA");
136 gen.addJumpIfR0GreaterThan(0xffffffffL, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800137 gen.addLoadImmediate(R0, 98);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800138 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000000002401fa000480f000000000000000000019030000"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800139 gen.addLoad32(R0, 122);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800140 gen.addJumpIfR0Equals(0x0, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski762b7c32024-02-08 13:49:43 -0800141 gen.addJumpIfR0LessThan(0x78, "LABEL_535");
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800142 gen.addJumpIfR0LessThan(0x91e, "LABEL_UNSOLICITED_MULTICAST_NA");
143 gen.addJumpIfR0GreaterThan(0x1b58, "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800144
Maciej Żenczykowski762b7c32024-02-08 13:49:43 -0800145 gen.defineLabel("LABEL_535");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800146 gen.addLoadImmediate(R0, 126);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800147 gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("2401fa000480f00000000000000000010701"), "LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800148 gen.addLoadImmediate(R1, -72);
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800149 gen.addJump("LABEL_INC_AND_DROP");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800150
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800151 gen.defineLabel("LABEL_UNSOLICITED_MULTICAST_NA");
Maciej Żenczykowski42e34942024-02-07 21:55:58 -0800152 gen.addLoadImmediate(R1, -40);
153
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800154 gen.defineLabel("LABEL_INC_AND_PASS");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -0800155 gen.addLoadData(R0, 0);
156 gen.addAdd(1);
157 gen.addStoreData(R0, 0);
158 gen.addJump(PASS_LABEL);
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -0800159
Maciej Żenczykowskid68c77f2024-02-08 14:22:05 -0800160 gen.defineLabel("LABEL_INC_AND_DROP");
Maciej Żenczykowski090fb742024-01-19 12:12:07 -0800161 gen.addLoadData(R0, 0);
162 gen.addAdd(1);
163 gen.addStoreData(R0, 0);
164 gen.addJump(DROP_LABEL);
Maciej Żenczykowskic0726cc2024-01-18 18:33:31 -0800165
Maciej Żenczykowski090fb742024-01-19 12:12:07 -0800166 byte[] program = gen.generate();
167 final String programString = toHexString(program).toLowerCase();
Maciej Żenczykowski762b7c32024-02-08 13:49:43 -0800168 final String referenceProgramHexString = "6bf8b03a01b8120c6b8894022b06006b847c022488a27c021f88a47c021a88b87c021588cd7c021088e17c020b88e384004608066a0e6dff68a401f6000600010800060412147a1f016dff648401e900021a1c6b807c01e00000686bc8a401cc0006ffffffffffff6a266bb0a401c50004c0a801ec6bec7401ba120c84007808000a17821f1112149c00181fffab0d2a108211446a3239a205067e9046bc70086be874018f0a1e52f06ba07c018a00e06ba81a1e7e0000017dffffffff6ba47e00000172c0a801ff0a1782140612149c000d1fffab0d2a108206076dff6c7401596bdc68a401450006ffffffffffff6bac7401466be474013b7c001386dd686bc4a401280006ffffffffffff6bbc7401290a147c011c00007a0e3a6b8c0a267c011600ff6bd474010b0a366b9c7c010800858218886a26a2040fff02000000000000000000000000006b9872edaa0e82e096aa0f8c00d9048e68a2c60f7e9046bc700828c68e23672c86dd606a12a2ad1400603afffe800000000000002ac68efffe23672c6a36a2a60286006a3aa29f0240c0123c940098091e8c00931b586a3ea2721c0000000000000000010128c68e23672c05010000000005dc030440c01a5a9600000067555555558e0000005effffffff1a5e9600000053555555558e0000004affffffff6a62a22d18000000002401fa000480f0000000000000000000190300001a7a7a2800920a78940020091e8c001b1b586a7ea204122401fa000480f000000000000000000107016bb872086bd8b03a01b87206b03a01b87201";
Maciej Żenczykowski63c2df92024-01-19 12:32:24 -0800169 assertEquals(referenceProgramHexString, programString);
Maciej Żenczykowski090fb742024-01-19 12:12:07 -0800170 }