diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler/codegen/arm/Thumb2/Factory.cc | 32 |
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) { |