From 18050000d76b5458938e5b563e2374dbd2d5831e Mon Sep 17 00:00:00 2001 From: Bernie Innocenti Date: Thu, 19 Apr 2018 20:53:00 +0900 Subject: [PATCH] apf: Add immediate encoding tests for LI This tests that ApfGenerator knows how to optimally encode positive and negative immediates of various sizes. Equivalent tests will follow for LDDW and STDW. Change-Id: Ia904aecb155c78569e3cf32a2431570281570481 Bug: 73804303 Test: runtest tests/net/java/android/net/apf/ApfTest.java --- tests/net/java/android/net/apf/ApfTest.java | 75 +++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java index f8a413226bd25..ed9cbabaf0eb6 100644 --- a/tests/net/java/android/net/apf/ApfTest.java +++ b/tests/net/java/android/net/apf/ApfTest.java @@ -150,15 +150,24 @@ public class ApfTest { assertVerdict(DROP, program, packet); } - private void assertDataMemoryContents( - int expected, byte[] program, byte[] packet, byte[] data, byte[] expected_data) - throws IllegalInstructionException, Exception { + private void assertProgramEquals(byte[] expected, byte[] program) throws AssertionError { + // assertArrayEquals() would only print one byte, making debugging difficult. + if (!java.util.Arrays.equals(expected, program)) { + throw new AssertionError( + "\nexpected: " + HexDump.toHexString(expected) + + "\nactual: " + HexDump.toHexString(program)); + } + } + + private void assertDataMemoryContents( + int expected, byte[] program, byte[] packet, byte[] data, byte[] expected_data) + throws IllegalInstructionException, Exception { assertReturnCodesEqual(expected, apfSimulate(program, packet, data, 0 /* filterAge */)); // assertArrayEquals() would only print one byte, making debugging difficult. if (!java.util.Arrays.equals(expected_data, data)) { throw new Exception( - "program: " + HexDump.toHexString(program) + + "\nprogram: " + HexDump.toHexString(program) + "\ndata memory: " + HexDump.toHexString(data) + "\nexpected: " + HexDump.toHexString(expected_data)); } @@ -622,6 +631,64 @@ public class ApfTest { } } + /** + * Test that the generator emits immediates using the shortest possible encoding. + */ + @Test + public void testImmediateEncoding() throws IllegalInstructionException { + final int LI_OPCODE = 13 << 3; + ApfGenerator gen; + + // 0-byte immediate: li R0, 0 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 0); + assertProgramEquals(new byte[]{LI_OPCODE | (0 << 1)}, gen.generate()); + + // 1-byte immediate: li R0, 42 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 42); + assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), 42}, gen.generate()); + + // 2-byte immediate: li R1, 0x1234 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R1, 0x1234); + assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1 , 0x12, 0x34}, gen.generate()); + + // 4-byte immediate: li R0, 0x12345678 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 0x12345678); + assertProgramEquals( + new byte[]{LI_OPCODE | (3 << 1), 0x12, 0x34, 0x56, 0x78}, + gen.generate()); + } + + /** + * Test that the generator emits negative immediates using the shortest possible encoding. + */ + @Test + public void testNegativeImmediateEncoding() throws IllegalInstructionException { + final int LI_OPCODE = 13 << 3; + ApfGenerator gen; + + // 1-byte negative immediate: li R0, -42 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, -42); + assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), -42}, gen.generate()); + + // 2-byte negative immediate: li R1, -0x1234 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R1, -0x1122); + assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1, (byte)0xEE, (byte)0xDE}, + gen.generate()); + + // 4-byte negative immediate: li R0, -0x11223344 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, -0x11223344); + assertProgramEquals( + new byte[]{LI_OPCODE | (3 << 1), (byte)0xEE, (byte)0xDD, (byte)0xCC, (byte)0xBC}, + gen.generate()); + } + @Test public void testApfDataWrite() throws IllegalInstructionException, Exception { byte[] packet = new byte[MIN_PKT_SIZE];