Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Unified Diff: runtime/vm/constants_arm64.h

Issue 227593012: Adds ldr and str to arm64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/constants_arm64.h
===================================================================
--- runtime/vm/constants_arm64.h (revision 34800)
+++ runtime/vm/constants_arm64.h (working copy)
@@ -47,15 +47,16 @@
kNumberOfCpuRegisters = 32,
kNoRegister = -1,
+ // These registers both use the encoding R31, but to avoid mistakes we give
+ // them different values, and then translate before encoding.
+ SP = 32,
+ ZR = 33,
+
// Aliases.
IP0 = R25,
IP1 = R26,
FP = R29,
LR = R30,
-
- // Left abstract so we can avoid misuse.
- SP,
- ZR,
};
enum VRegister {
@@ -214,6 +215,21 @@
kDWord,
};
+static inline int Log2OperandSizeBytes(OperandSize os) {
+ switch (os) {
+ case kByte: case kUnsignedByte: return 0;
+ case kHalfword: case kUnsignedHalfword: return 1;
+ case kWord: case kUnsignedWord: return 2;
regis 2014/04/07 23:38:19 It would be more readable to use one case per line
zra 2014/04/08 15:14:13 Done.
+ case kDoubleWord: return 3;
+ case kSWord: return 2;
+ case kDWord: return 3;
+ default:
+ UNREACHABLE();
+ break;
+ }
+ return -1;
+}
+
// Opcodes from C3
// C3.1.
enum MainOp {
@@ -261,6 +277,13 @@
RET = BR | B22,
};
+enum LoadStoreRegOp {
+ LoadStoreRegMask = 0x3a000000,
+ LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
+ STR = LoadStoreRegFixed,
+ LDR = LoadStoreRegFixed | B22,
+};
+
// C3.4.1
enum AddSubImmOp {
AddSubImmMask = 0x1f000000,
@@ -296,6 +319,7 @@
_V(DPSimd2) \
_V(ExceptionGen) \
_V(System) \
+_V(LoadStoreReg) \
_V(UnconditionalBranchReg) \
_V(AddSubImm) \
_V(MoveWide) \
@@ -341,6 +365,10 @@
kSFShift = 31,
kSFBits = 1,
+ // size field,
+ kSzShift = 30,
+ kSzBits = 2,
+
// Registers.
kRdShift = 0,
kRdBits = 5,
@@ -350,12 +378,16 @@
kRaBits = 5,
kRmShift = 16,
kRmBits = 5,
+ kRtShift = 0,
+ kRtBits = 5,
// Immediates.
kImm3Shift = 10,
kImm3Bits = 3,
kImm6Shift = 10,
kImm6Bits = 6,
+ kImm9Shift = 12,
+ kImm9Bits = 9,
kImm12Shift = 10,
kImm12Bits = 12,
kImm12ShiftShift = 22,
@@ -434,6 +466,7 @@
inline int SField() const { return Bit(kSShift); }
inline int SFField() const { return Bit(kSFShift); }
+ inline int SzField() const { return Bits(kSzShift, kSzBits); }
inline Register RdField() const { return static_cast<Register>(
Bits(kRdShift, kRdBits)); }
inline Register RnField() const { return static_cast<Register>(
@@ -442,10 +475,16 @@
Bits(kRaShift, kRaBits)); }
inline Register RmField() const { return static_cast<Register>(
Bits(kRmShift, kRmBits)); }
+ inline Register RtField() const { return static_cast<Register>(
+ Bits(kRtShift, kRtBits)); }
// Immediates
inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
inline int Imm6Field() const { return Bits(kImm6Shift, kImm6Bits); }
+ inline int Imm9Field() const { return Bits(kImm9Shift, kImm9Bits); }
+ // Sign-extended Imm9Field()
+ inline int64_t SImm9Field() const {
+ return (static_cast<int32_t>(Imm9Field()) << 23) >> 23; }
inline int Imm12Field() const { return Bits(kImm12Shift, kImm12Bits); }
inline int Imm16Field() const { return Bits(kImm16Shift, kImm16Bits); }

Powered by Google App Engine
This is Rietveld 408576698