Index: src/constants-arm.h |
=================================================================== |
--- src/constants-arm.h (revision 661) |
+++ src/constants-arm.h (working copy) |
@@ -33,62 +33,74 @@ |
// Defines constants and accessor classes to assemble, disassemble and |
// simulate ARM instructions. |
// |
+// Section references in the code refer to the "ARM Architecture Reference |
+// Manual" from July 2005 (available at http://www.arm.com/miscPDFs/14128.pdf) |
+// |
// Constants for specific fields are defined in their respective named enums. |
// General constants are in an anonymous enum in class Instr. |
typedef unsigned char byte; |
+// Values for the condition field as defined in section A3.2 |
enum Condition { |
no_condition = -1, |
- EQ = 0, |
- NE = 1, |
- CS = 2, |
- CC = 3, |
- MI = 4, |
- PL = 5, |
- VS = 6, |
- VC = 7, |
- HI = 8, |
- LS = 9, |
- GE = 10, |
- LT = 11, |
- GT = 12, |
- LE = 13, |
- AL = 14, |
- special_condition = 15 |
+ EQ = 0, // equal |
+ NE = 1, // not equal |
+ CS = 2, // carry set/unsigned higher or same |
+ CC = 3, // carry clear/unsigned lower |
+ MI = 4, // minus/negative |
+ PL = 5, // plus/positive or zero |
+ VS = 6, // overflow |
+ VC = 7, // no overflow |
+ HI = 8, // unsigned higher |
+ LS = 9, // unsigned lower or same |
+ GE = 10, // signed greater than or equal |
+ LT = 11, // signed less than |
+ GT = 12, // signed greater than |
+ LE = 13, // signed less than or equal |
+ AL = 14, // always (unconditional) |
+ special_condition = 15, // special condition (refer to section A3.2.1) |
+ max_condition = 16 |
}; |
+// Opcodes for Data-processing instructions (instructions with a type 0 and 1) |
+// as defined in section A3.4 |
enum Opcode { |
no_operand = -1, |
- AND = 0, |
- EOR = 1, |
- SUB = 2, |
- RSB = 3, |
- ADD = 4, |
- ADC = 5, |
- SBC = 6, |
- RSC = 7, |
- TST = 8, |
- TEQ = 9, |
- CMP = 10, |
- CMN = 11, |
- ORR = 12, |
- MOV = 13, |
- BIC = 14, |
- MVN = 15 |
+ AND = 0, // Logical AND |
+ EOR = 1, // Logical Exclusive OR |
+ SUB = 2, // Subtract |
+ RSB = 3, // Reverse Subtract |
+ ADD = 4, // Add |
+ ADC = 5, // Add with Carry |
+ SBC = 6, // Subtract with Carry |
+ RSC = 7, // Reverse Subtract with Carry |
+ TST = 8, // Test |
+ TEQ = 9, // Test Equivalence |
+ CMP = 10, // Compare |
+ CMN = 11, // Compare Negated |
+ ORR = 12, // Logical (inclusive) OR |
+ MOV = 13, // Move |
+ BIC = 14, // Bit Clear |
+ MVN = 15, // Move Not |
+ max_operand = 16 |
}; |
+// Shifter types for Data-processing operands as defined in section A5.1.2. |
enum Shift { |
no_shift = -1, |
- LSL = 0, |
- LSR = 1, |
- ASR = 2, |
- ROR = 3 |
+ LSL = 0, // Logical shift left |
+ LSR = 1, // Logical shift right |
+ ASR = 2, // Arithmetic shift right |
+ ROR = 3, // Rotate right |
+ max_shift = 4 |
}; |
+// Special Software Interrupt codes when used in the presence of the ARM |
+// simulator. |
enum SoftwareInterruptCodes { |
// transition to C code |
call_rt_r5 = 0x10, |
@@ -102,7 +114,17 @@ |
// The class Instr enables access to individual fields defined in the ARM |
-// architecture. |
+// architecture instruction set encoding as described in figure A3-1. |
+// |
+// Example: Test whether the instruction at ptr does set the condition code |
+// bits. |
+// |
+// bool InstructionSetsConditionCodes(byte* ptr) { |
+// Instr *instr = Instr::At(ptr); |
+// int type = instr->TypeField(); |
+// return ((type == 0) || (type == 1)) && instr->HasS(); |
+// } |
+// |
class Instr { |
public: |
enum { |
@@ -110,25 +132,29 @@ |
kPCReadOffset = 8 |
}; |
- // Get the raw instruction bits |
+ // Get the raw instruction bits. |
inline instr_t InstructionBits() const { |
return *reinterpret_cast<const instr_t*>(this); |
} |
+ // Set the raw instruction bits to value. |
inline void SetInstructionBits(instr_t value) { |
*reinterpret_cast<instr_t*>(this) = value; |
} |
+ // Read one particular bit out of the instruction bits. |
inline int Bit(int nr) const { |
return (InstructionBits() >> nr) & 1; |
} |
+ // Read a bit field out of the instruction bits. |
inline int Bits(int hi, int lo) const { |
return (InstructionBits() >> lo) & ((2 << (hi - lo)) - 1); |
} |
// Accessors for the different named fields used in the ARM encoding. |
+ // The naming of these accessor corresponds to figure A3-1. |
// Generally applicable fields |
inline Condition ConditionField() const { |
return static_cast<Condition>(Bits(31, 28)); |