[Baseline] Store constant directly in emit_op_mov
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jun 2018 04:45:24 +0000 (04:45 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jun 2018 04:45:24 +0000 (04:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186182

Reviewed by Saam Barati.

In the old code, we first move a constant to a register and store it to the specified address.
But in 64bit JSC, we can directly store a constant to the specified address. This reduces the
generated code size. Since the old code was emitting a constant in a code anyway, this change
never increases the size of the generated code.

* jit/JITInlines.h:
(JSC::JIT::emitGetVirtualRegister):
We remove this obsolete comment. Our OSR relies on the fact that values are stored and loaded
from the stack. If we transfer values in registers without loading values from the stack, it
breaks this assumption.

* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_mov):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232387 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jit/JITInlines.h
Source/JavaScriptCore/jit/JITOpcodes.cpp

index fb19a5a407985bf346319db1b79d5742746fb102..526c31e0643e24ea94ca005e3c77e9d62f17acef 100644 (file)
@@ -1,3 +1,24 @@
+2018-05-31  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [Baseline] Store constant directly in emit_op_mov
+        https://bugs.webkit.org/show_bug.cgi?id=186182
+
+        Reviewed by Saam Barati.
+
+        In the old code, we first move a constant to a register and store it to the specified address.
+        But in 64bit JSC, we can directly store a constant to the specified address. This reduces the
+        generated code size. Since the old code was emitting a constant in a code anyway, this change
+        never increases the size of the generated code.
+
+        * jit/JITInlines.h:
+        (JSC::JIT::emitGetVirtualRegister):
+        We remove this obsolete comment. Our OSR relies on the fact that values are stored and loaded
+        from the stack. If we transfer values in registers without loading values from the stack, it
+        breaks this assumption.
+
+        * jit/JITOpcodes.cpp:
+        (JSC::JIT::emit_op_mov):
+
 2018-05-31  Caio Lima  <ticaiolima@gmail.com>
 
         [ESNext][BigInt] Implement support for "=<" and ">=" relational operation
 2018-05-31  Caio Lima  <ticaiolima@gmail.com>
 
         [ESNext][BigInt] Implement support for "=<" and ">=" relational operation
index 30b0ddde2d70ba627d6089656187ab9c647aaae3..723b73ed35d06c5699a221ec7ab4d558402b33ff 100644 (file)
@@ -572,7 +572,6 @@ ALWAYS_INLINE void JIT::emitGetVirtualRegister(int src, RegisterID dst)
 {
     ASSERT(m_bytecodeOffset != std::numeric_limits<unsigned>::max()); // This method should only be called during hot/cold path generation, so that m_bytecodeOffset is set.
 
 {
     ASSERT(m_bytecodeOffset != std::numeric_limits<unsigned>::max()); // This method should only be called during hot/cold path generation, so that m_bytecodeOffset is set.
 
-    // TODO: we want to reuse values that are already in registers if we can - add a register allocator!
     if (m_codeBlock->isConstantRegisterIndex(src)) {
         JSValue value = m_codeBlock->getConstant(src);
         if (!value.isNumber())
     if (m_codeBlock->isConstantRegisterIndex(src)) {
         JSValue value = m_codeBlock->getConstant(src);
         if (!value.isNumber())
index 38621d886e70c4158ecd7a8eaa9f6dc1105cb829..459d1a2db5a1dc1ad0c1b12203ee71fda2bca276 100644 (file)
@@ -57,8 +57,17 @@ void JIT::emit_op_mov(Instruction* currentInstruction)
     int dst = currentInstruction[1].u.operand;
     int src = currentInstruction[2].u.operand;
 
     int dst = currentInstruction[1].u.operand;
     int src = currentInstruction[2].u.operand;
 
-    emitGetVirtualRegister(src, regT0);
-    emitPutVirtualRegister(dst);
+    if (m_codeBlock->isConstantRegisterIndex(src)) {
+        JSValue value = m_codeBlock->getConstant(src);
+        if (!value.isNumber())
+            store64(TrustedImm64(JSValue::encode(value)), addressFor(dst));
+        else
+            store64(Imm64(JSValue::encode(value)), addressFor(dst));
+        return;
+    }
+
+    load64(addressFor(src), regT0);
+    store64(regT0, addressFor(dst));
 }
 
 
 }