diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-05-22 14:45:59 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-06-17 14:44:23 +0200 |
commit | c6921eca61d1f393f6cd08484da29da7d67d9695 (patch) | |
tree | 82605ddef1a519c2772836eaf692eb66210b7035 /src/qml/jit/qv4regalloc.cpp | |
parent | 7acdace9be3a68954152455acd527fa052c47b09 (diff) |
V4 JIT: teach regalloc about callee-saved registers.
Callee-saved registers won't get clobbered by a call, so any value
stored in it will survive the call.
Change-Id: I2b61b84617b01bf7ce7e81cd0119a6da689ee9d5
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jit/qv4regalloc.cpp')
-rw-r--r-- | src/qml/jit/qv4regalloc.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/qml/jit/qv4regalloc.cpp b/src/qml/jit/qv4regalloc.cpp index e21676e520..6a2f5ca640 100644 --- a/src/qml/jit/qv4regalloc.cpp +++ b/src/qml/jit/qv4regalloc.cpp @@ -1280,19 +1280,23 @@ void RegisterAllocator::prepareRanges() const int regCount = _normalRegisters.size(); _fixedRegisterRanges.reserve(regCount); for (int reg = 0; reg < regCount; ++reg) { - LifeTimeInterval *lti = cloneFixedInterval(reg, false, ltiWithCalls); - _fixedRegisterRanges.append(lti); - if (lti->isValid()) - _active.append(lti); + if (_normalRegisters.at(reg)->isCallerSaved()) { + LifeTimeInterval *lti = cloneFixedInterval(reg, false, ltiWithCalls); + _fixedRegisterRanges.append(lti); + if (lti->isValid()) + _active.append(lti); + } } const int fpRegCount = _fpRegisters.size(); _fixedFPRegisterRanges.reserve(fpRegCount); for (int fpReg = 0; fpReg < fpRegCount; ++fpReg) { - LifeTimeInterval *lti = cloneFixedInterval(fpReg, true, ltiWithCalls); - _fixedFPRegisterRanges.append(lti); - if (lti->isValid()) - _active.append(lti); + if (_fpRegisters.at(fpReg)->isCallerSaved()) { + LifeTimeInterval *lti = cloneFixedInterval(fpReg, true, ltiWithCalls); + _fixedFPRegisterRanges.append(lti); + if (lti->isValid()) + _active.append(lti); + } } } |