| @Test | |
| public void testFullApfV4ProgramGeneration() throws IllegalInstructionException { | |
| ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4); | |
| gen.addLoadImmediate(R1, -4); | |
| gen.addLoadData(R0, 0); | |
| gen.addAdd(1); | |
| gen.addStoreData(R0, 0); | |
| gen.addLoad16(R0, 12); | |
| gen.addLoadImmediate(R1, -108); | |
| gen.addJumpIfR0LessThan(0x600, "LABEL_345"); | |
| gen.addLoadImmediate(R1, -112); | |
| gen.addJumpIfR0Equals(0x88a2, "LABEL_345"); | |
| gen.addJumpIfR0Equals(0x88a4, "LABEL_345"); | |
| gen.addJumpIfR0Equals(0x88b8, "LABEL_345"); | |
| gen.addJumpIfR0Equals(0x88cd, "LABEL_345"); | |
| gen.addJumpIfR0Equals(0x88e1, "LABEL_345"); | |
| gen.addJumpIfR0Equals(0x88e3, "LABEL_345"); | |
| gen.addJumpIfR0NotEquals(0x806, "LABEL_115"); | |
| gen.addLoadImmediate(R0, 14); | |
| gen.addLoadImmediate(R1, -36); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_339"); | |
| gen.addLoad16(R0, 20); | |
| gen.addJumpIfR0Equals(0x1, "LABEL_100"); | |
| gen.addLoadImmediate(R1, -40); | |
| gen.addJumpIfR0NotEquals(0x2, "LABEL_339"); | |
| gen.addLoad32(R0, 28); | |
| gen.addLoadImmediate(R1, -116); | |
| gen.addJumpIfR0Equals(0x0, "LABEL_345"); | |
| gen.addLoadImmediate(R0, 0); | |
| gen.addLoadImmediate(R1, -44); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339"); | |
| gen.defineLabel("LABEL_100"); | |
| gen.addLoadImmediate(R0, 38); | |
| gen.addLoadImmediate(R1, -68); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("c0a801be"), "LABEL_345"); | |
| gen.addLoadImmediate(R1, -8); | |
| gen.addJump("LABEL_339"); | |
| gen.defineLabel("LABEL_115"); | |
| gen.addLoad16(R0, 12); | |
| gen.addJumpIfR0NotEquals(0x800, "LABEL_263"); | |
| gen.addLoad8(R0, 23); | |
| gen.addJumpIfR0NotEquals(0x11, "LABEL_157"); | |
| gen.addLoad16(R0, 20); | |
| gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_157"); | |
| gen.addLoadFromMemory(R1, 13); | |
| gen.addLoad16Indexed(R0, 16); | |
| gen.addJumpIfR0NotEquals(0x44, "LABEL_157"); | |
| gen.addLoadImmediate(R0, 50); | |
| gen.addAddR1(); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ea42226789c0"), "LABEL_157"); | |
| gen.addLoadImmediate(R1, -12); | |
| gen.addJump("LABEL_339"); | |
| gen.defineLabel("LABEL_157"); | |
| gen.addLoad8(R0, 30); | |
| gen.addAnd(240); | |
| gen.addLoadImmediate(R1, -84); | |
| gen.addJumpIfR0Equals(0xe0, "LABEL_345"); | |
| gen.addLoadImmediate(R1, -76); | |
| gen.addLoad32(R0, 30); | |
| gen.addJumpIfR0Equals(0xffffffff, "LABEL_345"); | |
| gen.addLoadImmediate(R1, -80); | |
| gen.addJumpIfR0Equals(0xc0a801ff, "LABEL_345"); | |
| gen.addLoad8(R0, 23); | |
| gen.addJumpIfR0NotEquals(0x11, "LABEL_243"); | |
| gen.addLoadImmediate(R0, 26); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("6b7a1f1fc0a801be"), "LABEL_243"); | |
| gen.addLoadFromMemory(R0, 13); | |
| gen.addAdd(8); | |
| gen.addSwap(); | |
| gen.addLoad16(R0, 16); | |
| gen.addNeg(R1); | |
| gen.addAddR1(); | |
| gen.addJumpIfR0NotEquals(0x1, "LABEL_243"); | |
| gen.addLoadFromMemory(R0, 13); | |
| gen.addAdd(14); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("1194ceca"), "LABEL_243"); | |
| gen.addAdd(8); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff"), "LABEL_243"); | |
| gen.addLoadImmediate(R1, -128); | |
| gen.addJump("LABEL_345"); | |
| gen.defineLabel("LABEL_243"); | |
| gen.addLoadImmediate(R1, -24); | |
| gen.addLoadImmediate(R0, 0); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339"); | |
| gen.addLoadImmediate(R1, -72); | |
| gen.addJump("LABEL_345"); | |
| gen.addLoadImmediate(R1, -16); | |
| gen.addJump("LABEL_339"); | |
| gen.defineLabel("LABEL_263"); | |
| gen.addJumpIfR0Equals(0x86dd, "LABEL_284"); | |
| gen.addLoadImmediate(R0, 0); | |
| gen.addLoadImmediate(R1, -48); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339"); | |
| gen.addLoadImmediate(R1, -56); | |
| gen.addJump("LABEL_345"); | |
| gen.defineLabel("LABEL_284"); | |
| gen.addLoad8(R0, 20); | |
| gen.addJumpIfR0Equals(0x0, "LABEL_339"); | |
| gen.addJumpIfR0Equals(0x3a, "LABEL_303"); | |
| gen.addLoadImmediate(R1, -104); | |
| gen.addLoad8(R0, 38); | |
| gen.addJumpIfR0Equals(0xff, "LABEL_345"); | |
| gen.addLoadImmediate(R1, -32); | |
| gen.addJump("LABEL_339"); | |
| gen.defineLabel("LABEL_303"); | |
| gen.addLoad8(R0, 54); | |
| gen.addLoadImmediate(R1, -88); | |
| gen.addJumpIfR0Equals(0x85, "LABEL_345"); | |
| gen.addJumpIfR0NotEquals(0x88, "LABEL_337"); | |
| gen.addLoadImmediate(R0, 38); | |
| gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_337"); | |
| gen.addLoadImmediate(R1, -92); | |
| gen.addJump("LABEL_345"); | |
| gen.defineLabel("LABEL_337"); | |
| gen.addLoadImmediate(R1, -28); | |
| gen.defineLabel("LABEL_339"); | |
| gen.addLoadData(R0, 0); | |
| gen.addAdd(1); | |
| gen.addStoreData(R0, 0); | |
| gen.addJump(PASS_LABEL); | |
| gen.defineLabel("LABEL_345"); | |
| gen.addLoadData(R0, 0); | |
| gen.addAdd(1); | |
| gen.addStoreData(R0, 0); | |
| gen.addJump(DROP_LABEL); | |
| byte[] program = gen.generate(); | |
| final String programString = toHexString(program).toLowerCase(); | |
| final String referenceProgramHexString = "6bfcb03a01b8120c6b9494014a06006b907c014388a27c013e88a47c013988b87c013488cd7c012f88e17c012a88e384003f08066a0e6bdca40110000600010800060412147a1c016bd884010400021a1c6b8c7c01010000686bd4a2ef06ffffffffffff6a266bbca2ea04c0a801be6bf872e0120c84008d08000a17821e1112149c00171fffab0d2a108210446a3239a20406ea42226789c06bf472b60a1e52f06bac7ab3e06bb41a1e7e000000a6ffffffff6bb07e0000009bc0a801ff0a178230116a1aa223086b7a1f1fc0a801beaa0d3a08aa221210ab2139821501aa0d3a0ea20a041194ceca3a08a20401ff6b8072666be868a25406ffffffffffff6bb872566bf0724c7c001086dd686bd0a23b06ffffffffffff6bc8723d0a147a32007a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201"; | |
| assertEquals(referenceProgramHexString, programString); | |
| } |