summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/arm/MethodCodegenDriver.cc
diff options
context:
space:
mode:
author buzbee <buzbee@google.com> 2011-09-15 17:54:28 -0700
committer buzbee <buzbee@google.com> 2011-09-15 17:54:28 -0700
commitf48e97135ef8008197af5d8925a6642d71bea014 (patch)
tree7ce112b56187e85a78075af161014e165773935e /src/compiler/codegen/arm/MethodCodegenDriver.cc
parent8692721dd8a3679ca874c3d1be0cecb62ff148f6 (diff)
Def/Use mask fix for vldm/vstm
We're using a few new Thumb instructions now (floating point load and store multiple), and the calculation of the use/def masks was incorrect. Change-Id: I3eb17ebf6dc3bc2e6e8a4da48228cad6ff7c5cfb
Diffstat (limited to 'src/compiler/codegen/arm/MethodCodegenDriver.cc')
-rw-r--r--src/compiler/codegen/arm/MethodCodegenDriver.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index b8045e22a8..9f89ff9807 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -848,11 +848,16 @@ static int genDalvikArgsRange(CompilationUnit* cUnit, MIR* mir,
int regsLeft = std::min(numArgs - 3, 16);
callState = nextCallInsn(cUnit, mir, dInsn, callState, rollback);
opRegRegImm(cUnit, kOpAdd, r3, rSP, startOffset);
- newLIR3(cUnit, kThumb2Vldms, r3, fr0, regsLeft);
+ ArmLIR* ld = newLIR3(cUnit, kThumb2Vldms, r3, fr0, regsLeft);
+ //TUNING: loosen barrier
+ ld->defMask = ENCODE_ALL;
+ setMemRefType(ld, true /* isLoad */, kDalvikReg);
callState = nextCallInsn(cUnit, mir, dInsn, callState, rollback);
opRegRegImm(cUnit, kOpAdd, r3, rSP, 4 /* Method* */ + (3 * 4));
callState = nextCallInsn(cUnit, mir, dInsn, callState, rollback);
- newLIR3(cUnit, kThumb2Vstms, r3, fr0, regsLeft);
+ ArmLIR* st = newLIR3(cUnit, kThumb2Vstms, r3, fr0, regsLeft);
+ setMemRefType(st, false /* isLoad */, kDalvikReg);
+ st->defMask = ENCODE_ALL;
callState = nextCallInsn(cUnit, mir, dInsn, callState, rollback);
}