@Override public void translate( final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException { TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "sh"); final String rt = instruction.getOperands().get(0).getRootNode().getChildren().get(0).getValue(); final long baseOffset = ReilHelpers.toReilAddress(instruction.getAddress()).toLong(); long offset = baseOffset; final String address = SignExtendGenerator.extendAndAdd( offset, environment, instruction.getOperands().get(1), instructions); offset = baseOffset + instructions.size(); final OperandSize dw = OperandSize.DWORD; final OperandSize wd = OperandSize.WORD; final String isolatedHalfword = environment.getNextVariableString(); instructions.add( ReilHelpers.createAnd(offset++, dw, rt, wd, String.valueOf(0xFFFFL), wd, isolatedHalfword)); instructions.add(ReilHelpers.createStm(offset++, wd, isolatedHalfword, dw, address)); }
@Override public void translate( final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException { // TODO final String todo64 = ""; TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "lwr"); final OperandSize dw = OperandSize.DWORD; final OperandSize qw = OperandSize.QWORD; final String lastTwoAddressBits = environment.getNextVariableString(); final String shiftValue = environment.getNextVariableString(); final String memoryShiftAmount = environment.getNextVariableString(); final String registerMaskShiftAmount = environment.getNextVariableString(); final String shiftedMemoryContent = environment.getNextVariableString(); final String shiftedMemoryMask = environment.getNextVariableString(); final String maskedRegisterContent = environment.getNextVariableString(); final String temporaryResult = environment.getNextVariableString(); final String memoryContent = environment.getNextVariableString(); final String address = environment.getNextVariableString(); final IOperandTreeNode targetRegister = instruction.getOperands().get(0).getRootNode().getChildren().get(0); final long baseOffset = ReilHelpers.toReilAddress(instruction.getAddress()).toLong(); long offset = baseOffset; final String extendedValue = SignExtendGenerator.extendAndAdd( offset, environment, instruction.getOperands().get(1), instructions); offset = baseOffset + instructions.size(); instructions.add( ReilHelpers.createAnd( offset++, dw, extendedValue, dw, String.valueOf(0xFFFFFFFCL), dw, address)); instructions.add(ReilHelpers.createLdm(offset, dw, address, dw, memoryContent)); instructions.add( ReilHelpers.createAnd( offset++, dw, extendedValue, dw, String.valueOf(3L), dw, lastTwoAddressBits)); instructions.add( ReilHelpers.createBsh( offset++, dw, lastTwoAddressBits, dw, String.valueOf(3L), dw, shiftValue)); final String endianess = "little"; if (endianess.equalsIgnoreCase("little")) { // little endian case // address bits 1:0 00 // memory content 0x11223344 shifted right by 0 -> 0x11223344 // register content 0xAABBCCDD masked with 0x00000000 -> 0x00000000 // both ored -> 0x11223344 // anded with register mask 0xFFFFFFFF -> 0x11223344 instructions.add( ReilHelpers.createSub( offset++, dw, String.valueOf(0L), dw, shiftValue, dw, memoryShiftAmount)); instructions.add( ReilHelpers.createSub( offset++, dw, String.valueOf(32L), dw, shiftValue, dw, registerMaskShiftAmount)); } else if (endianess.equalsIgnoreCase("big")) { // big endian case // address bits 1:0 00 // memory content 0x11223344 shifted right by 24 -> 0x00000011 // register contents 0xAABBCCDD masked with 0xFFFFFF00 -> 0xAABBCC00 // both ored -> 0xAABBCC11 // anded with register mask 0xFFFFFFF -> 0xAABBCC11 instructions.add( ReilHelpers.createAdd( offset++, dw, String.valueOf(-24L), dw, shiftValue, dw, memoryShiftAmount)); instructions.add( ReilHelpers.createAdd( offset++, dw, String.valueOf(8L), dw, shiftValue, dw, registerMaskShiftAmount)); } // bring the loaded memory into the correct position for register transfer instructions.add( ReilHelpers.createBsh( offset++, dw, memoryContent, dw, memoryShiftAmount, qw, shiftedMemoryContent)); // bring the register content into the correct form instructions.add( ReilHelpers.createBsh( offset++, dw, String.valueOf(0xFFFFFFFFL), dw, registerMaskShiftAmount, dw, shiftedMemoryMask)); instructions.add( ReilHelpers.createAnd( offset++, dw, targetRegister.getValue(), dw, shiftedMemoryMask, dw, maskedRegisterContent)); // combine the extracted information and adjust the size to machine register size instructions.add( ReilHelpers.createOr( offset++, dw, maskedRegisterContent, qw, shiftedMemoryContent, qw, temporaryResult)); instructions.add( ReilHelpers.createAnd( offset++, qw, temporaryResult, dw, String.valueOf(0xFFFFFFFFL), dw, targetRegister.getValue())); }