Index: runtime/vm/assembler_arm.h |
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h |
index 38dcedcca3ef24e13712deb28a50f125a14623be..9ba279c5f571b57fc2a9cf5b28587524ea05d3fa 100644 |
--- a/runtime/vm/assembler_arm.h |
+++ b/runtime/vm/assembler_arm.h |
@@ -23,6 +23,49 @@ namespace dart { |
class RuntimeEntry; |
class StubEntry; |
+ |
+// Instruction encoding bits. |
+enum { |
+ H = 1 << 5, // halfword (or byte) |
+ L = 1 << 20, // load (or store) |
+ S = 1 << 20, // set condition code (or leave unchanged) |
+ W = 1 << 21, // writeback base register (or leave unchanged) |
+ A = 1 << 21, // accumulate in multiply instruction (or not) |
+ B = 1 << 22, // unsigned byte (or word) |
+ D = 1 << 22, // high/lo bit of start of s/d register range |
+ N = 1 << 22, // long (or short) |
+ U = 1 << 23, // positive (or negative) offset/index |
+ P = 1 << 24, // offset/pre-indexed addressing (or post-indexed addressing) |
+ I = 1 << 25, // immediate shifter operand (or not) |
+ |
+ B0 = 1, |
+ B1 = 1 << 1, |
+ B2 = 1 << 2, |
+ B3 = 1 << 3, |
+ B4 = 1 << 4, |
+ B5 = 1 << 5, |
+ B6 = 1 << 6, |
+ B7 = 1 << 7, |
+ B8 = 1 << 8, |
+ B9 = 1 << 9, |
+ B10 = 1 << 10, |
+ B11 = 1 << 11, |
+ B12 = 1 << 12, |
+ B16 = 1 << 16, |
+ B17 = 1 << 17, |
+ B18 = 1 << 18, |
+ B19 = 1 << 19, |
+ B20 = 1 << 20, |
+ B21 = 1 << 21, |
+ B22 = 1 << 22, |
+ B23 = 1 << 23, |
+ B24 = 1 << 24, |
+ B25 = 1 << 25, |
+ B26 = 1 << 26, |
+ B27 = 1 << 27, |
+}; |
+ |
+ |
class Label : public ValueObject { |
public: |
Label() : position_(0) { } |
@@ -488,6 +531,16 @@ class Assembler : public ValueObject { |
// Note that gdb sets breakpoints using the undefined instruction 0xe7f001f0. |
void bkpt(uint16_t imm16); |
+ static int32_t BkptEncoding(uint16_t imm16) { |
+ // bkpt requires that the cond field is AL. |
+ return (AL << kConditionShift) | B24 | B21 | |
+ ((imm16 >> 4) << 8) | B6 | B5 | B4 | (imm16 & 0xf); |
+ } |
+ |
+ static uword GetBreakInstructionFiller() { |
+ return BkptEncoding(0); |
+ } |
+ |
// Floating point instructions (VFPv3-D16 and VFPv3-D32 profiles). |
void vmovsr(SRegister sn, Register rt, Condition cond = AL); |
void vmovrs(Register rt, SRegister sn, Condition cond = AL); |