#!/bin/bash set -e set -u # depends on 'm apf_disassembler' "${ANDROID_HOST_OUT}/bin/apf_disassembler" < apf2java.in > apf2java.txt sed -r \ 's@: li +r([01]), (-?[0-9]+)@: gen.addLoadImmediate(R\1, \2);@;'\ 's@: and +r0, (-?[0-9]+)@: gen.addAnd(\1);@;'\ 's@: add +r0, (-?[0-9]+)@: gen.addAdd(\1);@;'\ 's@: add +r0, r1@: gen.addAddR1();@;'\ 's@: swap +@: gen.addSwap();@;'\ 's@: neg +r([01])@: gen.addNeg(R\1);@;'\ 's@: jmp +(PASS|DROP)@: gen.addJump(\1_LABEL);@;'\ 's@: jbsne +r0, 0x([0-9a-f]+), ([0-9]+), ([0-9a-f]+)@: gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("\3"), LABEL_\2);@;'\ 's@: jeq +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1Equals(0x\2, LABEL_\3);@;'\ 's@: jne +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1NotEquals(0x\2, LABEL_\3);@;'\ 's@: jlt +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1LessThan(0x\2, LABEL_\3);@;'\ 's@: jgt +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1GreaterThan(0x\2, LABEL_\3);@;'\ 's@: jset +r([01]), 0x([0-9a-f]+), ([0-9]+)@: gen.addJumpIfR\1AnyBitsSet(0x\2, LABEL_\3);@;'\ 's@: jmp +([0-9]+)@: gen.addJump(LABEL_\1);@;'\ 's@: lddw +r0, \[r1\]@: gen.addLoadData(R0, 0);@;'\ 's@: stdw +r0, \[r1\]@: gen.addStoreData(R0, 0);@;'\ 's@: ldb +r([01]), \[([0-9]+)\]@: gen.addLoad8(R\1, \2);@;'\ 's@: ldh +r([01]), \[([0-9]+)\]@: gen.addLoad16(R\1, \2);@;'\ 's@: ldw +r([01]), \[([0-9]+)\]@: gen.addLoad32(R\1, \2);@;'\ 's@: ldbx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad8Indexed(R\1, \2);@;'\ 's@: ldhx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad16Indexed(R\1, \2);@;'\ 's@: ldwx +r([01]), \[r1\+([0-9]+)\]@: gen.addLoad32Indexed(R\1, \2);@;'\ 's@: ldm +r([01]), m\[([0-9]+)\]@: gen.addLoadFromMemory(R\1, \2);@;'\ '/addJumpIfR0(Greater|Less)Than/s@(0x[8-f][0-9a-f]{7})@\1L@;'\ < apf2java.txt > tmp declare -ar LABELS=($(sed -rn 's@.*LABEL_([0-9]+).*@\1@p' < tmp | sort -u)) for L in "${LABELS[@]}"; do #echo "[LABEL_${L}]" sed -r "s@^( +${L}:)@\ngen.defineLabel(LABEL_${L});\n\1@" < tmp > tmp2 cat tmp2 > tmp done sed -r \ 's@^ +[0-9]+: @@;'\ 's@(LABEL_[0-9]+)@"\1"@;'\ "s@\"LABEL_${LABELS[-1]}\"@\"LABEL_INC_AND_DROP\"@;"\ "s@\"LABEL_${LABELS[-2]}\"@\"LABEL_INC_AND_PASS\"@;"\ "s@\"LABEL_${LABELS[-3]}\"@\"LABEL_UNSOLICITED_MULTICAST_NA\"@;"\ < tmp > tmp2 # The above label renames are based on what our current generator emits as prologue. if [[ "$(egrep -v '^$|gen' < tmp2 | wc -l)" != 0 ]]; then echo 'Failure to translate:' egrep -v '^$|gen' < tmp2 exit 1 fi { echo ' @Test' echo ' public void testFullApfV4ProgramGeneration() throws IllegalInstructionException {' echo ' ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4);' sed -r 's@^(.+)$@ \1@' < tmp2 echo echo ' byte[] program = gen.generate();' echo ' final String programString = toHexString(program).toLowerCase();' echo -n ' final String referenceProgramHexString = "' tr -d '\n' < apf2java.in echo '";' echo ' assertEquals(referenceProgramHexString, programString);' echo ' }' } > apf2java.out rm -f tmp tmp2