aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2017-11-21 10:00:45 +0100
committerLars Knoll <lars.knoll@qt.io>2017-11-23 15:05:22 +0000
commit1f5c79c59aa43e416778a2046e4121731b34bb6a (patch)
tree27dbc03f147d484e79c40b42c79abc2a2291655b /src
parent8df195c8765429652ccf31e9de9829bbae5ba5bb (diff)
V4: Collapse LoadRegExp+StoreReg into MoveRegExp
LoadRegExp is nearly always followed by a store of the accumulator, so change LoadRegExp to be MoveRegExp. This saves an instruction. Change-Id: I5d47c5bf6ffd7f28247c328410872c3b229ca23c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qv4codegen.cpp5
-rw-r--r--src/qml/compiler/qv4instr_moth.cpp6
-rw-r--r--src/qml/compiler/qv4instr_moth_p.h4
-rw-r--r--src/qml/jit/qv4jit.cpp7
-rw-r--r--src/qml/jit/qv4jit_p.h2
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp6
6 files changed, 16 insertions, 14 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index b9d223bab0..68bda2dcd3 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -1885,12 +1885,13 @@ bool Codegen::visit(RegExpLiteral *ast)
if (hasError)
return false;
- auto r = Reference::fromAccumulator(this);
+ auto r = Reference::fromStackSlot(this);
r.isReadonly = true;
_expr.setResult(r);
- Instruction::LoadRegExp instr;
+ Instruction::MoveRegExp instr;
instr.regExpId = jsUnitGenerator->registerRegExp(ast);
+ instr.destReg = r.stackSlot();
bytecodeGenerator->addInstruction(instr);
return false;
}
diff --git a/src/qml/compiler/qv4instr_moth.cpp b/src/qml/compiler/qv4instr_moth.cpp
index 9cfde99e6b..3fc8882937 100644
--- a/src/qml/compiler/qv4instr_moth.cpp
+++ b/src/qml/compiler/qv4instr_moth.cpp
@@ -261,9 +261,9 @@ void dumpBytecode(const char *code, int len, int nLocals, int nFormals, int /*st
d << stringId;
MOTH_END_INSTR(LoadRuntimeString)
- MOTH_BEGIN_INSTR(LoadRegExp)
- d << regExpId;
- MOTH_END_INSTR(LoadRegExp)
+ MOTH_BEGIN_INSTR(MoveRegExp)
+ d << dumpRegister(destReg, nFormals) << ", " <<regExpId;
+ MOTH_END_INSTR(MoveRegExp)
MOTH_BEGIN_INSTR(LoadClosure)
d << value;
diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h
index e0b013eb95..06cf34481c 100644
--- a/src/qml/compiler/qv4instr_moth_p.h
+++ b/src/qml/compiler/qv4instr_moth_p.h
@@ -89,7 +89,7 @@ QT_BEGIN_NAMESPACE
#define INSTR_LoadScopedLocal(op) INSTRUCTION(op, LoadScopedLocal, 2, scope, index)
#define INSTR_StoreScopedLocal(op) INSTRUCTION(op, StoreScopedLocal, 2, scope, index)
#define INSTR_LoadRuntimeString(op) INSTRUCTION(op, LoadRuntimeString, 1, stringId)
-#define INSTR_LoadRegExp(op) INSTRUCTION(op, LoadRegExp, 1, regExpId)
+#define INSTR_MoveRegExp(op) INSTRUCTION(op, MoveRegExp, 2, regExpId, destReg)
#define INSTR_LoadClosure(op) INSTRUCTION(op, LoadClosure, 1, value)
#define INSTR_LoadName(op) INSTRUCTION(op, LoadName, 1, name)
#define INSTR_LoadGlobalLookup(op) INSTRUCTION(op, LoadGlobalLookup, 1, index)
@@ -205,7 +205,7 @@ QT_BEGIN_NAMESPACE
F(LoadScopedLocal) \
F(StoreScopedLocal) \
F(LoadRuntimeString) \
- F(LoadRegExp) \
+ F(MoveRegExp) \
F(LoadClosure) \
F(LoadName) \
F(LoadGlobalLookup) \
diff --git a/src/qml/jit/qv4jit.cpp b/src/qml/jit/qv4jit.cpp
index a8bdd20fbd..e1737cbe45 100644
--- a/src/qml/jit/qv4jit.cpp
+++ b/src/qml/jit/qv4jit.cpp
@@ -255,12 +255,13 @@ void BaselineJIT::generate_LoadRuntimeString(int stringId)
as->loadString(stringId);
}
-void BaselineJIT::generate_LoadRegExp(int regExpId)
+void BaselineJIT::generate_MoveRegExp(int regExpId, int destReg)
{
as->prepareCallWithArgCount(2);
as->passInt32AsArg(regExpId, 1);
as->passEngineAsArg(0);
JIT_GENERATE_RUNTIME_CALL(Runtime::method_regexpLiteral, Assembler::ResultInAccumulator);
+ as->storeReg(destReg);
}
void BaselineJIT::generate_LoadClosure(int value)
@@ -1062,8 +1063,8 @@ void BaselineJIT::collectLabelsInBytecode()
MOTH_BEGIN_INSTR(LoadRuntimeString)
MOTH_END_INSTR(LoadRuntimeString)
- MOTH_BEGIN_INSTR(LoadRegExp)
- MOTH_END_INSTR(LoadRegExp)
+ MOTH_BEGIN_INSTR(MoveRegExp)
+ MOTH_END_INSTR(MoveRegExp)
MOTH_BEGIN_INSTR(LoadClosure)
MOTH_END_INSTR(LoadClosure)
diff --git a/src/qml/jit/qv4jit_p.h b/src/qml/jit/qv4jit_p.h
index dfa2a79c48..f9e2a9650c 100644
--- a/src/qml/jit/qv4jit_p.h
+++ b/src/qml/jit/qv4jit_p.h
@@ -137,7 +137,7 @@ public:
void generate_LoadScopedLocal(int scope, int index) Q_DECL_OVERRIDE;
void generate_StoreScopedLocal(int scope, int index) Q_DECL_OVERRIDE;
void generate_LoadRuntimeString(int stringId) Q_DECL_OVERRIDE;
- void generate_LoadRegExp(int regExpId) Q_DECL_OVERRIDE;
+ void generate_MoveRegExp(int regExpId, int destReg) Q_DECL_OVERRIDE;
void generate_LoadClosure(int value) Q_DECL_OVERRIDE;
void generate_LoadName(int name) Q_DECL_OVERRIDE;
void generate_LoadGlobalLookup(int index) Q_DECL_OVERRIDE;
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp
index adf43812cf..59cfc5f075 100644
--- a/src/qml/jsruntime/qv4vme_moth.cpp
+++ b/src/qml/jsruntime/qv4vme_moth.cpp
@@ -652,9 +652,9 @@ QV4::ReturnedValue VME::exec(const FunctionObject *fo, const Value *thisObject,
acc = function->compilationUnit->runtimeStrings[stringId]->asReturnedValue();
MOTH_END_INSTR(LoadRuntimeString)
- MOTH_BEGIN_INSTR(LoadRegExp)
- acc = Runtime::method_regexpLiteral(engine, regExpId);
- MOTH_END_INSTR(LoadRegExp)
+ MOTH_BEGIN_INSTR(MoveRegExp)
+ STACK_VALUE(destReg) = Runtime::method_regexpLiteral(engine, regExpId);
+ MOTH_END_INSTR(MoveRegExp)
MOTH_BEGIN_INSTR(LoadClosure)
acc = Runtime::method_closure(engine, value);