summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/codegen/arm/Thumb2/Factory.cc32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/compiler/codegen/arm/Thumb2/Factory.cc b/src/compiler/codegen/arm/Thumb2/Factory.cc
index 9b7d29927d..0a43aae064 100644
--- a/src/compiler/codegen/arm/Thumb2/Factory.cc
+++ b/src/compiler/codegen/arm/Thumb2/Factory.cc
@@ -691,16 +691,24 @@ STATIC ArmLIR* loadBaseIndexed(CompilationUnit* cUnit, int rBase,
int regPtr;
if (FPREG(rDest)) {
- DCHECK(SINGLEREG(rDest));
- DCHECK((size == kWord) || (size == kSingle));
- opcode = kThumb2Vldrs;
- size = kSingle;
+ if (SINGLEREG(rDest)) {
+ DCHECK((size == kWord) || (size == kSingle));
+ opcode = kThumb2Vldrs;
+ size = kSingle;
+ } else {
+ DCHECK(DOUBLEREG(rDest));
+ DCHECK((size == kLong) || (size == kDouble));
+ DCHECK((rDest & 0x1) == 0);
+ opcode = kThumb2Vldrd;
+ size = kDouble;
+ }
} else {
if (size == kSingle)
size = kWord;
}
switch (size) {
+ case kDouble: // fall-through
case kSingle:
regPtr = oatAllocTemp(cUnit);
if (scale) {
@@ -747,16 +755,24 @@ STATIC ArmLIR* storeBaseIndexed(CompilationUnit* cUnit, int rBase,
int regPtr;
if (FPREG(rSrc)) {
- DCHECK(SINGLEREG(rSrc));
- DCHECK((size == kWord) || (size == kSingle));
- opcode = kThumb2Vstrs;
- size = kSingle;
+ if (SINGLEREG(rSrc)) {
+ DCHECK((size == kWord) || (size == kSingle));
+ opcode = kThumb2Vstrs;
+ size = kSingle;
+ } else {
+ DCHECK(DOUBLEREG(rSrc));
+ DCHECK((size == kLong) || (size == kDouble));
+ DCHECK((rSrc & 0x1) == 0);
+ opcode = kThumb2Vstrd;
+ size = kDouble;
+ }
} else {
if (size == kSingle)
size = kWord;
}
switch (size) {
+ case kDouble: // fall-through
case kSingle:
regPtr = oatAllocTemp(cUnit);
if (scale) {