Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (190674 => 190675)
--- trunk/Source/_javascript_Core/ChangeLog 2015-10-07 18:17:56 UTC (rev 190674)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-10-07 18:26:19 UTC (rev 190675)
@@ -1,5 +1,35 @@
2015-10-07 Filip Pizlo <fpi...@apple.com>
+ JIT::emitGetGlobalProperty/emitPutGlobalProperty are only called from one place
+ https://bugs.webkit.org/show_bug.cgi?id=149879
+
+ Reviewed by Saam Barati.
+
+ To simplify my work to insert barriers on loads of the butterfly, I want to reduce the amount
+ of abstraction we have around code that loads the butterfly.
+
+ * jit/JIT.h:
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emitLoadWithStructureCheck):
+ (JSC::JIT::emitGetVarFromPointer):
+ (JSC::JIT::emit_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitPutGlobalVariable):
+ (JSC::JIT::emit_op_put_to_scope):
+ (JSC::JIT::emitGetGlobalProperty): Deleted.
+ (JSC::JIT::emitPutGlobalProperty): Deleted.
+ * jit/JITPropertyAccess32_64.cpp:
+ (JSC::JIT::emitLoadWithStructureCheck):
+ (JSC::JIT::emitGetVarFromPointer):
+ (JSC::JIT::emit_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitPutGlobalVariable):
+ (JSC::JIT::emit_op_put_to_scope):
+ (JSC::JIT::emitGetGlobalProperty): Deleted.
+ (JSC::JIT::emitPutGlobalProperty): Deleted.
+
+2015-10-07 Filip Pizlo <fpi...@apple.com>
+
JIT::compileGetDirectOffset is useless
https://bugs.webkit.org/show_bug.cgi?id=149878
Modified: trunk/Source/_javascript_Core/jit/JIT.h (190674 => 190675)
--- trunk/Source/_javascript_Core/jit/JIT.h 2015-10-07 18:17:56 UTC (rev 190674)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2015-10-07 18:26:19 UTC (rev 190675)
@@ -668,7 +668,6 @@
void emitVarInjectionCheck(bool needsVarInjectionChecks);
void emitResolveClosure(int dst, int scope, bool needsVarInjectionChecks, unsigned depth);
void emitLoadWithStructureCheck(int scope, Structure** structureSlot);
- void emitGetGlobalProperty(uintptr_t* operandSlot);
#if USE(JSVALUE64)
void emitGetVarFromPointer(JSValue* operand, GPRReg);
void emitGetVarFromIndirectPointer(JSValue** operand, GPRReg);
@@ -677,7 +676,6 @@
void emitGetVarFromPointer(JSValue* operand, GPRReg tag, GPRReg payload);
#endif
void emitGetClosureVar(int scope, uintptr_t operand);
- void emitPutGlobalProperty(uintptr_t* operandSlot, int value);
void emitNotifyWrite(WatchpointSet*);
void emitNotifyWrite(GPRReg pointerToSet);
void emitPutGlobalVariable(JSValue* operand, int value, WatchpointSet*);
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (190674 => 190675)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2015-10-07 18:17:56 UTC (rev 190674)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2015-10-07 18:26:19 UTC (rev 190675)
@@ -754,25 +754,6 @@
addSlowCase(branch32(NotEqual, Address(regT0, JSCell::structureIDOffset()), regT1));
}
-void JIT::emitGetGlobalProperty(uintptr_t* operandSlot)
-{
- GPRReg base = regT0;
- GPRReg result = regT0;
- GPRReg offset = regT1;
- GPRReg scratch = regT2;
-
- load32(operandSlot, offset);
- if (!ASSERT_DISABLED) {
- Jump isOutOfLine = branch32(GreaterThanOrEqual, offset, TrustedImm32(firstOutOfLineOffset));
- abortWithReason(JITOffsetIsNotOutOfLine);
- isOutOfLine.link(this);
- }
- loadPtr(Address(base, JSObject::butterflyOffset()), scratch);
- neg32(offset);
- signExtend32ToPtr(offset, offset);
- load64(BaseIndex(scratch, offset, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), result);
-}
-
void JIT::emitGetVarFromPointer(JSValue* operand, GPRReg reg)
{
loadPtr(operand, reg);
@@ -801,10 +782,25 @@
auto emitCode = [&] (ResolveType resolveType, bool indirectLoadForOperand) {
switch (resolveType) {
case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks:
+ case GlobalPropertyWithVarInjectionChecks: {
emitLoadWithStructureCheck(scope, structureSlot); // Structure check covers var injection.
- emitGetGlobalProperty(operandSlot);
+ GPRReg base = regT0;
+ GPRReg result = regT0;
+ GPRReg offset = regT1;
+ GPRReg scratch = regT2;
+
+ load32(operandSlot, offset);
+ if (!ASSERT_DISABLED) {
+ Jump isOutOfLine = branch32(GreaterThanOrEqual, offset, TrustedImm32(firstOutOfLineOffset));
+ abortWithReason(JITOffsetIsNotOutOfLine);
+ isOutOfLine.link(this);
+ }
+ loadPtr(Address(base, JSObject::butterflyOffset()), scratch);
+ neg32(offset);
+ signExtend32ToPtr(offset, offset);
+ load64(BaseIndex(scratch, offset, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), result);
break;
+ }
case GlobalVar:
case GlobalVarWithVarInjectionChecks:
case GlobalLexicalVar:
@@ -901,16 +897,6 @@
callOperation(WithProfile, operationGetFromScope, dst, currentInstruction);
}
-void JIT::emitPutGlobalProperty(uintptr_t* operandSlot, int value)
-{
- emitGetVirtualRegister(value, regT2);
-
- loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0);
- loadPtr(operandSlot, regT1);
- negPtr(regT1);
- storePtr(regT2, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)));
-}
-
void JIT::emitPutGlobalVariable(JSValue* operand, int value, WatchpointSet* set)
{
emitGetVirtualRegister(value, regT0);
@@ -946,11 +932,17 @@
auto emitCode = [&] (ResolveType resolveType, bool indirectLoadForOperand) {
switch (resolveType) {
case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks:
+ case GlobalPropertyWithVarInjectionChecks: {
emitWriteBarrier(m_codeBlock->globalObject(), value, ShouldFilterValue);
emitLoadWithStructureCheck(scope, structureSlot); // Structure check covers var injection.
- emitPutGlobalProperty(operandSlot, value);
+ emitGetVirtualRegister(value, regT2);
+
+ loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0);
+ loadPtr(operandSlot, regT1);
+ negPtr(regT1);
+ storePtr(regT2, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)));
break;
+ }
case GlobalVar:
case GlobalVarWithVarInjectionChecks:
case GlobalLexicalVar:
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (190674 => 190675)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2015-10-07 18:17:56 UTC (rev 190674)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2015-10-07 18:26:19 UTC (rev 190675)
@@ -780,26 +780,6 @@
addSlowCase(branchPtr(NotEqual, Address(regT0, JSCell::structureIDOffset()), regT2));
}
-void JIT::emitGetGlobalProperty(uintptr_t* operandSlot)
-{
- GPRReg base = regT2;
- GPRReg resultTag = regT1;
- GPRReg resultPayload = regT0;
- GPRReg offset = regT3;
-
- move(regT0, base);
- load32(operandSlot, offset);
- if (!ASSERT_DISABLED) {
- Jump isOutOfLine = branch32(GreaterThanOrEqual, offset, TrustedImm32(firstOutOfLineOffset));
- abortWithReason(JITOffsetIsNotOutOfLine);
- isOutOfLine.link(this);
- }
- loadPtr(Address(base, JSObject::butterflyOffset()), base);
- neg32(offset);
- load32(BaseIndex(base, offset, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) + (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), resultPayload);
- load32(BaseIndex(base, offset, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) + (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), resultTag);
-}
-
void JIT::emitGetVarFromPointer(JSValue* operand, GPRReg tag, GPRReg payload)
{
uintptr_t rawAddress = bitwise_cast<uintptr_t>(operand);
@@ -831,10 +811,26 @@
auto emitCode = [&] (ResolveType resolveType, bool indirectLoadForOperand) {
switch (resolveType) {
case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks:
+ case GlobalPropertyWithVarInjectionChecks: {
emitLoadWithStructureCheck(scope, structureSlot); // Structure check covers var injection.
- emitGetGlobalProperty(operandSlot);
+ GPRReg base = regT2;
+ GPRReg resultTag = regT1;
+ GPRReg resultPayload = regT0;
+ GPRReg offset = regT3;
+
+ move(regT0, base);
+ load32(operandSlot, offset);
+ if (!ASSERT_DISABLED) {
+ Jump isOutOfLine = branch32(GreaterThanOrEqual, offset, TrustedImm32(firstOutOfLineOffset));
+ abortWithReason(JITOffsetIsNotOutOfLine);
+ isOutOfLine.link(this);
+ }
+ loadPtr(Address(base, JSObject::butterflyOffset()), base);
+ neg32(offset);
+ load32(BaseIndex(base, offset, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) + (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), resultPayload);
+ load32(BaseIndex(base, offset, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) + (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue)), resultTag);
break;
+ }
case GlobalVar:
case GlobalVarWithVarInjectionChecks:
case GlobalLexicalVar:
@@ -926,17 +922,6 @@
callOperation(WithProfile, operationGetFromScope, dst, currentInstruction);
}
-void JIT::emitPutGlobalProperty(uintptr_t* operandSlot, int value)
-{
- emitLoad(value, regT3, regT2);
-
- loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0);
- loadPtr(operandSlot, regT1);
- negPtr(regT1);
- store32(regT3, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)));
- store32(regT2, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));
-}
-
void JIT::emitPutGlobalVariable(JSValue* operand, int value, WatchpointSet* set)
{
emitLoad(value, regT1, regT0);
@@ -977,11 +962,18 @@
auto emitCode = [&] (ResolveType resolveType, bool indirectLoadForOperand) {
switch (resolveType) {
case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks:
+ case GlobalPropertyWithVarInjectionChecks: {
emitWriteBarrier(m_codeBlock->globalObject(), value, ShouldFilterValue);
emitLoadWithStructureCheck(scope, structureSlot); // Structure check covers var injection.
- emitPutGlobalProperty(operandSlot, value);
+ emitLoad(value, regT3, regT2);
+
+ loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0);
+ loadPtr(operandSlot, regT1);
+ negPtr(regT1);
+ store32(regT3, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)));
+ store32(regT2, BaseIndex(regT0, regT1, TimesEight, (firstOutOfLineOffset - 2) * sizeof(EncodedJSValue) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));
break;
+ }
case GlobalVar:
case GlobalVarWithVarInjectionChecks:
case GlobalLexicalVar: