summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/jit/SpecializedThunkJIT.h')
-rw-r--r--Source/JavaScriptCore/jit/SpecializedThunkJIT.h51
1 files changed, 27 insertions, 24 deletions
diff --git a/Source/JavaScriptCore/jit/SpecializedThunkJIT.h b/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
index 6ec1e71a7..05f41f4dc 100644
--- a/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
+++ b/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,14 +23,13 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef SpecializedThunkJIT_h
-#define SpecializedThunkJIT_h
+#pragma once
#if ENABLE(JIT)
-#include "Executable.h"
+#include "JIT.h"
+#include "JITInlines.h"
#include "JSInterfaceJIT.h"
-#include "JSStack.h"
#include "LinkBuffer.h"
namespace JSC {
@@ -41,13 +40,17 @@ namespace JSC {
SpecializedThunkJIT(VM* vm, int expectedArgCount)
: JSInterfaceJIT(vm)
{
+ emitFunctionPrologue();
+ emitSaveThenMaterializeTagRegisters();
// Check that we have the expected number of arguments
- m_failures.append(branch32(NotEqual, payloadFor(JSStack::ArgumentCount), TrustedImm32(expectedArgCount + 1)));
+ m_failures.append(branch32(NotEqual, payloadFor(CallFrameSlot::argumentCount), TrustedImm32(expectedArgCount + 1)));
}
explicit SpecializedThunkJIT(VM* vm)
: JSInterfaceJIT(vm)
{
+ emitFunctionPrologue();
+ emitSaveThenMaterializeTagRegisters();
}
void loadDoubleArgument(int argument, FPRegisterID dst, RegisterID scratch)
@@ -65,14 +68,18 @@ namespace JSC {
void loadJSStringArgument(VM& vm, int argument, RegisterID dst)
{
loadCellArgument(argument, dst);
- m_failures.append(branchPtr(NotEqual, Address(dst, JSCell::structureOffset()), TrustedImmPtr(vm.stringStructure.get())));
+ m_failures.append(branchStructure(NotEqual,
+ Address(dst, JSCell::structureIDOffset()),
+ vm.stringStructure.get()));
}
void loadArgumentWithSpecificClass(const ClassInfo* classInfo, int argument, RegisterID dst, RegisterID scratch)
{
loadCellArgument(argument, dst);
- loadPtr(Address(dst, JSCell::structureOffset()), scratch);
+ emitLoadStructure(dst, scratch, dst);
appendFailure(branchPtr(NotEqual, Address(scratch, Structure::classInfoOffset()), TrustedImmPtr(classInfo)));
+ // We have to reload the argument since emitLoadStructure clobbered it.
+ loadCellArgument(argument, dst);
}
void loadInt32Argument(int argument, RegisterID dst, Jump& failTarget)
@@ -97,7 +104,9 @@ namespace JSC {
{
if (src != regT0)
move(src, regT0);
- loadPtr(Address(callFrameRegister, CallFrame::callerFrameOffset()), callFrameRegister);
+
+ emitRestoreSavedTagRegisters();
+ emitFunctionEpilogue();
ret();
}
#else
@@ -105,7 +114,8 @@ namespace JSC {
{
ASSERT_UNUSED(payload, payload == regT0);
ASSERT_UNUSED(tag, tag == regT1);
- loadPtr(Address(callFrameRegister, CallFrame::callerFrameOffset()), callFrameRegister);
+ emitRestoreSavedTagRegisters();
+ emitFunctionEpilogue();
ret();
}
#endif
@@ -121,14 +131,7 @@ namespace JSC {
move(tagTypeNumberRegister, regT0);
done.link(this);
#else
-#if !CPU(X86)
- // The src register is not clobbered by moveDoubleToInts with ARM, MIPS and SH4 macro assemblers, so let's use it.
moveDoubleToInts(src, regT0, regT1);
-#else
- storeDouble(src, Address(stackPointerRegister, -(int)sizeof(double)));
- loadPtr(Address(stackPointerRegister, OBJECT_OFFSETOF(JSValue, u.asBits.tag) - sizeof(double)), regT1);
- loadPtr(Address(stackPointerRegister, OBJECT_OFFSETOF(JSValue, u.asBits.payload) - sizeof(double)), regT0);
-#endif
Jump lowNonZero = branchTestPtr(NonZero, regT1);
Jump highNonZero = branchTestPtr(NonZero, regT0);
move(TrustedImm32(0), regT0);
@@ -136,7 +139,8 @@ namespace JSC {
lowNonZero.link(this);
highNonZero.link(this);
#endif
- loadPtr(Address(callFrameRegister, CallFrame::callerFrameOffset()), callFrameRegister);
+ emitRestoreSavedTagRegisters();
+ emitFunctionEpilogue();
ret();
}
@@ -145,7 +149,8 @@ namespace JSC {
if (src != regT0)
move(src, regT0);
tagReturnAsInt32();
- loadPtr(Address(callFrameRegister, CallFrame::callerFrameOffset()), callFrameRegister);
+ emitRestoreSavedTagRegisters();
+ emitFunctionEpilogue();
ret();
}
@@ -154,13 +159,14 @@ namespace JSC {
if (src != regT0)
move(src, regT0);
tagReturnAsJSCell();
- loadPtr(Address(callFrameRegister, CallFrame::callerFrameOffset()), callFrameRegister);
+ emitRestoreSavedTagRegisters();
+ emitFunctionEpilogue();
ret();
}
MacroAssemblerCodeRef finalize(MacroAssemblerCodePtr fallback, const char* thunkKind)
{
- LinkBuffer patchBuffer(*m_vm, this, GLOBAL_THUNK_ID);
+ LinkBuffer patchBuffer(*m_vm, *this, GLOBAL_THUNK_ID);
patchBuffer.link(m_failures, CodeLocationLabel(fallback));
for (unsigned i = 0; i < m_calls.size(); i++)
patchBuffer.link(m_calls[i].first, m_calls[i].second);
@@ -184,7 +190,6 @@ namespace JSC {
}
private:
-
void tagReturnAsInt32()
{
#if USE(JSVALUE64)
@@ -208,5 +213,3 @@ namespace JSC {
}
#endif // ENABLE(JIT)
-
-#endif // SpecializedThunkJIT_h