summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/JITOpcodes.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-08-24 08:29:43 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-08-24 08:29:43 +0200
commit2e2ba8ff45915f40ed3e014101269c175f2a89a0 (patch)
tree3b94a9a9fa83efa384b8dac611cf8c6495532a62 /Source/JavaScriptCore/jit/JITOpcodes.cpp
parentf53e6f8e798362ed712d4a51633b0d0b03dbc213 (diff)
downloadqtwebkit-2e2ba8ff45915f40ed3e014101269c175f2a89a0.tar.gz
Imported WebKit commit bf0b0213bbf3886c96610020602012ca7d11b084 (http://svn.webkit.org/repository/webkit/trunk@126545)
New snapshot with clang and python build fixes
Diffstat (limited to 'Source/JavaScriptCore/jit/JITOpcodes.cpp')
-rw-r--r--Source/JavaScriptCore/jit/JITOpcodes.cpp45
1 files changed, 36 insertions, 9 deletions
diff --git a/Source/JavaScriptCore/jit/JITOpcodes.cpp b/Source/JavaScriptCore/jit/JITOpcodes.cpp
index 0d24961b8..8ebad61ff 100644
--- a/Source/JavaScriptCore/jit/JITOpcodes.cpp
+++ b/Source/JavaScriptCore/jit/JITOpcodes.cpp
@@ -479,8 +479,16 @@ void JIT::emit_op_is_undefined(Instruction* currentInstruction)
isCell.link(this);
loadPtr(Address(regT0, JSCell::structureOffset()), regT1);
- test8(NonZero, Address(regT1, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined), regT0);
-
+ Jump isMasqueradesAsUndefined = branchTest8(NonZero, Address(regT1, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined));
+ move(TrustedImm32(0), regT0);
+ Jump notMasqueradesAsUndefined = jump();
+
+ isMasqueradesAsUndefined.link(this);
+ move(TrustedImmPtr(m_codeBlock->globalObject()), regT0);
+ loadPtr(Address(regT1, Structure::globalObjectOffset()), regT1);
+ comparePtr(Equal, regT0, regT1, regT0);
+
+ notMasqueradesAsUndefined.link(this);
done.link(this);
emitTagAsBoolImmediate(regT0);
emitPutVirtualRegister(dst);
@@ -760,15 +768,18 @@ void JIT::emit_op_jeq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, JSCell::structureOffset()), regT2);
- addJump(branchTest8(NonZero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined)), target);
- Jump wasNotImmediate = jump();
+ Jump isNotMasqueradesAsUndefined = branchTest8(Zero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined));
+ move(TrustedImmPtr(m_codeBlock->globalObject()), regT0);
+ addJump(branchPtr(Equal, Address(regT2, Structure::globalObjectOffset()), regT0), target);
+ Jump masqueradesGlobalObjectIsForeign = jump();
// Now handle the immediate cases - undefined & null
isImmediate.link(this);
andPtr(TrustedImm32(~TagBitUndefined), regT0);
addJump(branchPtr(Equal, regT0, TrustedImmPtr(JSValue::encode(jsNull()))), target);
- wasNotImmediate.link(this);
+ isNotMasqueradesAsUndefined.link(this);
+ masqueradesGlobalObjectIsForeign.link(this);
};
void JIT::emit_op_jneq_null(Instruction* currentInstruction)
{
@@ -781,6 +792,8 @@ void JIT::emit_op_jneq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, JSCell::structureOffset()), regT2);
addJump(branchTest8(Zero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined)), target);
+ move(TrustedImmPtr(m_codeBlock->globalObject()), regT0);
+ addJump(branchPtr(NotEqual, Address(regT2, Structure::globalObjectOffset()), regT0), target);
Jump wasNotImmediate = jump();
// Now handle the immediate cases - undefined & null
@@ -1172,8 +1185,14 @@ void JIT::emit_op_eq_null(Instruction* currentInstruction)
Jump isImmediate = emitJumpIfNotJSCell(regT0);
loadPtr(Address(regT0, JSCell::structureOffset()), regT2);
- test8(NonZero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined), regT0);
-
+ Jump isMasqueradesAsUndefined = branchTest8(NonZero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined));
+ move(TrustedImm32(0), regT0);
+ Jump wasNotMasqueradesAsUndefined = jump();
+
+ isMasqueradesAsUndefined.link(this);
+ move(TrustedImmPtr(m_codeBlock->globalObject()), regT0);
+ loadPtr(Address(regT2, Structure::globalObjectOffset()), regT2);
+ comparePtr(Equal, regT0, regT2, regT0);
Jump wasNotImmediate = jump();
isImmediate.link(this);
@@ -1182,6 +1201,7 @@ void JIT::emit_op_eq_null(Instruction* currentInstruction)
comparePtr(Equal, regT0, TrustedImm32(ValueNull), regT0);
wasNotImmediate.link(this);
+ wasNotMasqueradesAsUndefined.link(this);
emitTagAsBoolImmediate(regT0);
emitPutVirtualRegister(dst);
@@ -1197,8 +1217,14 @@ void JIT::emit_op_neq_null(Instruction* currentInstruction)
Jump isImmediate = emitJumpIfNotJSCell(regT0);
loadPtr(Address(regT0, JSCell::structureOffset()), regT2);
- test8(Zero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined), regT0);
-
+ Jump isMasqueradesAsUndefined = branchTest8(NonZero, Address(regT2, Structure::typeInfoFlagsOffset()), TrustedImm32(MasqueradesAsUndefined));
+ move(TrustedImm32(1), regT0);
+ Jump wasNotMasqueradesAsUndefined = jump();
+
+ isMasqueradesAsUndefined.link(this);
+ move(TrustedImmPtr(m_codeBlock->globalObject()), regT0);
+ loadPtr(Address(regT2, Structure::globalObjectOffset()), regT2);
+ comparePtr(NotEqual, regT0, regT2, regT0);
Jump wasNotImmediate = jump();
isImmediate.link(this);
@@ -1207,6 +1233,7 @@ void JIT::emit_op_neq_null(Instruction* currentInstruction)
comparePtr(NotEqual, regT0, TrustedImm32(ValueNull), regT0);
wasNotImmediate.link(this);
+ wasNotMasqueradesAsUndefined.link(this);
emitTagAsBoolImmediate(regT0);
emitPutVirtualRegister(dst);