@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_504"); | |
gen.addLoadImmediate(R1, -112); | |
gen.addJumpIfR0Equals(0x88a2, "LABEL_504"); | |
gen.addJumpIfR0Equals(0x88a4, "LABEL_504"); | |
gen.addJumpIfR0Equals(0x88b8, "LABEL_504"); | |
gen.addJumpIfR0Equals(0x88cd, "LABEL_504"); | |
gen.addJumpIfR0Equals(0x88e1, "LABEL_504"); | |
gen.addJumpIfR0Equals(0x88e3, "LABEL_504"); | |
gen.addJumpIfR0NotEquals(0x806, "LABEL_116"); | |
gen.addLoadImmediate(R0, 14); | |
gen.addLoadImmediate(R1, -36); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_498"); | |
gen.addLoad16(R0, 20); | |
gen.addJumpIfR0Equals(0x1, "LABEL_102"); | |
gen.addLoadImmediate(R1, -40); | |
gen.addJumpIfR0NotEquals(0x2, "LABEL_498"); | |
gen.addLoad32(R0, 28); | |
gen.addLoadImmediate(R1, -116); | |
gen.addJumpIfR0Equals(0x0, "LABEL_504"); | |
gen.addLoadImmediate(R0, 0); | |
gen.addLoadImmediate(R1, -44); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_498"); | |
gen.defineLabel("LABEL_102"); | |
gen.addLoad32(R0, 38); | |
gen.addLoadImmediate(R1, -64); | |
gen.addJumpIfR0Equals(0x0, "LABEL_504"); | |
gen.addLoadImmediate(R1, -8); | |
gen.addJump("LABEL_498"); | |
gen.defineLabel("LABEL_116"); | |
gen.addLoad16(R0, 12); | |
gen.addJumpIfR0NotEquals(0x800, "LABEL_207"); | |
gen.addLoad8(R0, 23); | |
gen.addJumpIfR0NotEquals(0x11, "LABEL_159"); | |
gen.addLoad16(R0, 20); | |
gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_159"); | |
gen.addLoadFromMemory(R1, 13); | |
gen.addLoad16Indexed(R0, 16); | |
gen.addJumpIfR0NotEquals(0x44, "LABEL_159"); | |
gen.addLoadImmediate(R0, 50); | |
gen.addAddR1(); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("e212507c6345"), "LABEL_159"); | |
gen.addLoadImmediate(R1, -12); | |
gen.addJump("LABEL_498"); | |
gen.defineLabel("LABEL_159"); | |
gen.addLoad8(R0, 30); | |
gen.addAnd(240); | |
gen.addLoadImmediate(R1, -84); | |
gen.addJumpIfR0Equals(0xe0, "LABEL_504"); | |
gen.addLoadImmediate(R1, -76); | |
gen.addLoad32(R0, 30); | |
gen.addJumpIfR0Equals(0xffffffff, "LABEL_504"); | |
gen.addLoadImmediate(R1, -24); | |
gen.addLoadImmediate(R0, 0); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_498"); | |
gen.addLoadImmediate(R1, -72); | |
gen.addJump("LABEL_504"); | |
gen.addLoadImmediate(R1, -16); | |
gen.addJump("LABEL_498"); | |
gen.defineLabel("LABEL_207"); | |
gen.addJumpIfR0Equals(0x86dd, "LABEL_231"); | |
gen.addLoadImmediate(R0, 0); | |
gen.addLoadImmediate(R1, -48); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_498"); | |
gen.addLoadImmediate(R1, -56); | |
gen.addJump("LABEL_504"); | |
gen.defineLabel("LABEL_231"); | |
gen.addLoad8(R0, 20); | |
gen.addJumpIfR0Equals(0x3a, "LABEL_249"); | |
gen.addLoadImmediate(R1, -104); | |
gen.addLoad8(R0, 38); | |
gen.addJumpIfR0Equals(0xff, "LABEL_504"); | |
gen.addLoadImmediate(R1, -32); | |
gen.addJump("LABEL_498"); | |
gen.defineLabel("LABEL_249"); | |
gen.addLoad8(R0, 54); | |
gen.addLoadImmediate(R1, -88); | |
gen.addJumpIfR0Equals(0x85, "LABEL_504"); | |
gen.addJumpIfR0NotEquals(0x88, "LABEL_283"); | |
gen.addLoadImmediate(R0, 38); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_283"); | |
gen.addLoadImmediate(R1, -92); | |
gen.addJump("LABEL_504"); | |
gen.defineLabel("LABEL_283"); | |
gen.addLoadFromMemory(R0, 14); | |
gen.addJumpIfR0NotEquals(0xa6, "LABEL_496"); | |
gen.addLoadFromMemory(R0, 15); | |
gen.addJumpIfR0GreaterThan(0x254, "LABEL_496"); | |
gen.addLoadImmediate(R0, 0); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("e212507c6345648788fd6df086dd68"), "LABEL_496"); | |
gen.addLoadImmediate(R0, 18); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("00703afffe800000000000002a0079e10abc1539fe80000000000000e01250fffe7c63458600"), "LABEL_496"); | |
gen.addLoadImmediate(R0, 58); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("4000"), "LABEL_496"); | |
gen.addLoad16(R0, 60); | |
gen.addJumpIfR0LessThan(0x254, "LABEL_496"); | |
gen.addLoadImmediate(R0, 62); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("0000000000000000"), "LABEL_496"); | |
gen.addLoadImmediate(R0, 78); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("19050000"), "LABEL_496"); | |
gen.addLoad32(R0, 82); | |
gen.addJumpIfR0LessThan(0x254, "LABEL_496"); | |
gen.addLoadImmediate(R0, 86); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("2001486048600000000000000000646420014860486000000000000000000064"), "LABEL_496"); | |
gen.addLoadImmediate(R0, 118); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("030440c0"), "LABEL_496"); | |
gen.addLoad32(R0, 122); | |
gen.addJumpIfR0LessThan(0x254, "LABEL_496"); | |
gen.addLoad32(R0, 126); | |
gen.addJumpIfR0LessThan(0x254, "LABEL_496"); | |
gen.addLoadImmediate(R0, 130); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("00000000"), "LABEL_496"); | |
gen.addLoadImmediate(R0, 134); | |
gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("2a0079e10abc15390000000000000000"), "LABEL_496"); | |
gen.addLoadImmediate(R1, -60); | |
gen.addJump("LABEL_504"); | |
gen.defineLabel("LABEL_496"); | |
gen.addLoadImmediate(R1, -28); | |
gen.defineLabel("LABEL_498"); | |
gen.addLoadData(R0, 0); | |
gen.addAdd(1); | |
gen.addStoreData(R0, 0); | |
gen.addJump(PASS_LABEL); | |
gen.defineLabel("LABEL_504"); | |
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 = "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a20506e212507c63456bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0a6aa0f8c00c9025468a2b60fe212507c6345648788fd6df086dd686a12a28b2600703afffe800000000000002a0079e10abc1539fe80000000000000e01250fffe7c634586006a3aa284024000123c94007d02546a3ea2700800000000000000006a4ea26704190500001a5294006002546a56a23b2020014860486000000000000000006464200148604860000000000000000000646a76a23204030440c01a7a94002b02541a7e94002402546c0082a21a04000000006c0086a204102a0079e10abc153900000000000000006bc472086be4b03a01b87206b03a01b87201"; | |
assertEquals(referenceProgramHexString, programString); | |
} |