From: <mic...@us...> - 2007-04-12 17:34:58
|
Revision: 31 http://svn.sourceforge.net/pearcolator/?rev=31&view=rev Author: michael_baer Date: 2007-04-12 10:34:57 -0700 (Thu, 12 Apr 2007) Log Message: ----------- Checked in Visitor pattern method that should have been committed in the last patch. Modified Paths: -------------- src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoders.java Modified: src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoders.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoders.java 2007-04-12 17:31:57 UTC (rev 30) +++ src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoders.java 2007-04-12 17:34:57 UTC (rev 31) @@ -50,6 +50,7 @@ return (value << (32 - bitsUsed)) >> (32 - bitsUsed); } + /** A base class for all (conditional) ARM instructions. */ private abstract static class Basic { /** @see #getCondition() */ protected final byte condition; @@ -62,6 +63,9 @@ public final byte getCondition() { return condition; } + + /** All instruction classes are meant to implement the visitor pattern. This is the pattern's visit method. */ + public abstract void visit(ARM_InstructionVisitor visitor); } /** Base class for most instructions that use two registers. */ @@ -386,6 +390,11 @@ public static boolean conforms(int instr) { return getBits(instr, 26, 27) == 0; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a LDR/SDR instruction. */ @@ -459,6 +468,11 @@ public static boolean conforms(int instr) { return getBits(instr, 26, 27) == 1; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a normal (not long) multiply instruction. */ @@ -472,6 +486,11 @@ public static boolean conforms(int instr) { return getBits(instr, 22, 27) == 0 && getBits(instr, 4, 7) == 9; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a long multiply instruction. */ @@ -505,6 +524,11 @@ public static boolean conforms(int instr) { return getBits(instr, 23, 27) == 1 && getBits(instr, 4, 7) == 9; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a SWP/SWPB instruction. */ @@ -528,6 +552,11 @@ return getBits(instr, 23, 27) == 2 && getBits(instr, 20, 21) == 0 && getBits(instr, 4, 11) == 9; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a LDM/STM instruction. */ @@ -608,6 +637,11 @@ public byte getBaseRegister() { return baseRegister; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a SWI instruction*/ @@ -630,6 +664,11 @@ public static boolean conforms(int instr) { return getBits(instr, 24, 27) == 15; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a branch instruction. */ @@ -661,6 +700,11 @@ public static boolean conforms(int instr) { return getBits(instr, 25, 27) == 5; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a BX instruction set */ @@ -704,6 +748,11 @@ return getBits(instr, 25, 31) == 0x7D // BLX(1) || (getBits(instr, 20, 27) == 0x12 && getBits(instr, 6, 7) == 0); //BLX(2) && BX } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a LDC/STC instruction. */ @@ -777,6 +826,11 @@ public static boolean conforms(int instr) { return getBits(instr, 25, 27) == 6; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a CDP instruction. */ @@ -828,6 +882,11 @@ public static boolean conforms(int instr) { return getBits(instr, 24, 27) == 14 && !getBit(instr, 4); } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a MRC/MCR instruction. */ @@ -888,6 +947,11 @@ public static boolean conforms(int instr) { return getBits(instr, 24, 27) == 14 && getBit(instr, 4); } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a MRS instruction. */ @@ -920,6 +984,11 @@ public static boolean conforms(int instr) { return getBits(instr, 23, 27) == 2 && getBits(instr, 16, 21) == 0 && (instr & 0xFFF) == 0; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } /** Represents a MSR instruction. */ @@ -993,5 +1062,47 @@ public static boolean conforms(int instr) { return getBits(instr, 26, 27) == 0 && getBits(instr, 23, 24) == 2 && getBits(instr, 12, 15) == 0; } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } } + + /** Represents a CLZ instruction. */ + public final static class CountLeadingZeros extends Basic { + + /** @see #getRm() */ + protected final byte Rm; + + /** @see #getRd() */ + protected final byte Rd; + + public CountLeadingZeros(int instr) { + super(instr); + + Rm = (byte) (instr & 0xF); + Rd = (byte) getBits(instr, 12, 15); + } + + /** Returns the source register for this operation. */ + public byte getRm() { + return Rm; + } + + /** Returns the destination register for this operation. */ + public byte getRd() { + return Rd; + } + + /** Checks if <code>instr</code> is a valid bit representation of this instruction type. */ + public static boolean conforms(int instr) { + return getBits(instr, 16, 27) == 0x16F && getBits(instr, 4, 11) == 0xF1; + } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |