summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/ftl/FTLOutput.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/ftl/FTLOutput.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/ftl/FTLOutput.cpp')
-rw-r--r--Source/JavaScriptCore/ftl/FTLOutput.cpp269
1 files changed, 9 insertions, 260 deletions
diff --git a/Source/JavaScriptCore/ftl/FTLOutput.cpp b/Source/JavaScriptCore/ftl/FTLOutput.cpp
index c4f2861ad..fb2fc93b1 100644
--- a/Source/JavaScriptCore/ftl/FTLOutput.cpp
+++ b/Source/JavaScriptCore/ftl/FTLOutput.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,272 +28,21 @@
#if ENABLE(FTL_JIT)
-#include "B3MathExtras.h"
-#include "B3StackmapGenerationParams.h"
-
namespace JSC { namespace FTL {
-using namespace B3;
-
-Output::Output(State& state)
- : m_proc(*state.proc)
+Output::Output(LContext context)
+ : IntrinsicRepository(context)
+ , m_function(0)
+ , m_heaps(0)
+ , m_builder(llvm->CreateBuilderInContext(m_context))
+ , m_block(0)
+ , m_nextBlock(0)
{
}
Output::~Output()
{
-}
-
-void Output::initialize(AbstractHeapRepository& heaps)
-{
- m_heaps = &heaps;
-}
-
-LBasicBlock Output::newBlock()
-{
- LBasicBlock result = m_proc.addBlock(m_frequency);
-
- if (!m_nextBlock)
- m_blockOrder.append(result);
- else
- m_blockOrder.insertBefore(m_nextBlock, result);
-
- return result;
-}
-
-void Output::applyBlockOrder()
-{
- m_proc.setBlockOrder(m_blockOrder);
-}
-
-LBasicBlock Output::appendTo(LBasicBlock block, LBasicBlock nextBlock)
-{
- appendTo(block);
- return insertNewBlocksBefore(nextBlock);
-}
-
-void Output::appendTo(LBasicBlock block)
-{
- m_block = block;
-}
-
-SlotBaseValue* Output::lockedStackSlot(size_t bytes)
-{
- return m_block->appendNew<SlotBaseValue>(m_proc, origin(), m_proc.addStackSlot(bytes));
-}
-
-LValue Output::neg(LValue value)
-{
- return m_block->appendNew<Value>(m_proc, B3::Neg, origin(), value);
-}
-
-LValue Output::bitNot(LValue value)
-{
- return m_block->appendNew<B3::Value>(m_proc, B3::BitXor, origin(),
- value,
- m_block->appendIntConstant(m_proc, origin(), value->type(), -1));
-}
-
-LValue Output::logicalNot(LValue value)
-{
- return m_block->appendNew<B3::Value>(m_proc, B3::Equal, origin(), value, int32Zero);
-}
-
-LValue Output::load(TypedPointer pointer, LType type)
-{
- LValue load = m_block->appendNew<MemoryValue>(m_proc, Load, type, origin(), pointer.value());
- m_heaps->decorateMemory(pointer.heap(), load);
- return load;
-}
-
-LValue Output::doublePowi(LValue x, LValue y)
-{
- // FIXME: powDoubleInt32() should be inlined here since Output knows about block layout and
- // should be involved in any operation that creates blocks.
- // https://bugs.webkit.org/show_bug.cgi?id=152223
- auto result = powDoubleInt32(m_proc, m_block, origin(), x, y);
- m_block = result.first;
- return result.second;
-}
-
-bool Output::hasSensibleDoubleToInt()
-{
- return optimizeForX86();
-}
-
-LValue Output::doubleToInt(LValue value)
-{
- PatchpointValue* result = patchpoint(Int32);
- result->append(value, ValueRep::SomeRegister);
- result->setGenerator(
- [] (CCallHelpers& jit, const StackmapGenerationParams& params) {
- jit.truncateDoubleToInt32(params[1].fpr(), params[0].gpr());
- });
- result->effects = Effects::none();
- return result;
-}
-
-LValue Output::doubleToUInt(LValue value)
-{
- PatchpointValue* result = patchpoint(Int32);
- result->append(value, ValueRep::SomeRegister);
- result->setGenerator(
- [] (CCallHelpers& jit, const StackmapGenerationParams& params) {
- jit.truncateDoubleToUint32(params[1].fpr(), params[0].gpr());
- });
- result->effects = Effects::none();
- return result;
-}
-
-LValue Output::unsignedToDouble(LValue value)
-{
- return intToDouble(zeroExt(value, Int64));
-}
-
-LValue Output::load8SignExt32(TypedPointer pointer)
-{
- LValue load = m_block->appendNew<MemoryValue>(m_proc, Load8S, Int32, origin(), pointer.value());
- m_heaps->decorateMemory(pointer.heap(), load);
- return load;
-}
-
-LValue Output::load8ZeroExt32(TypedPointer pointer)
-{
- LValue load = m_block->appendNew<MemoryValue>(m_proc, Load8Z, Int32, origin(), pointer.value());
- m_heaps->decorateMemory(pointer.heap(), load);
- return load;
-}
-
-LValue Output::load16SignExt32(TypedPointer pointer)
-{
- LValue load = m_block->appendNew<MemoryValue>(m_proc, Load16S, Int32, origin(), pointer.value());
- m_heaps->decorateMemory(pointer.heap(), load);
- return load;
-}
-
-LValue Output::load16ZeroExt32(TypedPointer pointer)
-{
- LValue load = m_block->appendNew<MemoryValue>(m_proc, Load16Z, Int32, origin(), pointer.value());
- m_heaps->decorateMemory(pointer.heap(), load);
- return load;
-}
-
-void Output::store(LValue value, TypedPointer pointer)
-{
- LValue store = m_block->appendNew<MemoryValue>(m_proc, Store, origin(), value, pointer.value());
- m_heaps->decorateMemory(pointer.heap(), store);
-}
-
-void Output::store32As8(LValue value, TypedPointer pointer)
-{
- LValue store = m_block->appendNew<MemoryValue>(m_proc, Store8, origin(), value, pointer.value());
- m_heaps->decorateMemory(pointer.heap(), store);
-}
-
-void Output::store32As16(LValue value, TypedPointer pointer)
-{
- LValue store = m_block->appendNew<MemoryValue>(m_proc, Store16, origin(), value, pointer.value());
- m_heaps->decorateMemory(pointer.heap(), store);
-}
-
-LValue Output::baseIndex(LValue base, LValue index, Scale scale, ptrdiff_t offset)
-{
- LValue accumulatedOffset;
-
- switch (scale) {
- case ScaleOne:
- accumulatedOffset = index;
- break;
- case ScaleTwo:
- accumulatedOffset = shl(index, intPtrOne);
- break;
- case ScaleFour:
- accumulatedOffset = shl(index, intPtrTwo);
- break;
- case ScaleEight:
- case ScalePtr:
- accumulatedOffset = shl(index, intPtrThree);
- break;
- }
-
- if (offset)
- accumulatedOffset = add(accumulatedOffset, constIntPtr(offset));
-
- return add(base, accumulatedOffset);
-}
-
-void Output::branch(LValue condition, LBasicBlock taken, Weight takenWeight, LBasicBlock notTaken, Weight notTakenWeight)
-{
- m_block->appendNew<ControlValue>(
- m_proc, B3::Branch, origin(), condition,
- FrequentedBlock(taken, takenWeight.frequencyClass()),
- FrequentedBlock(notTaken, notTakenWeight.frequencyClass()));
-}
-
-void Output::check(LValue condition, WeightedTarget taken, Weight notTakenWeight)
-{
- LBasicBlock continuation = newBlock();
- branch(condition, taken, WeightedTarget(continuation, notTakenWeight));
- appendTo(continuation);
-}
-
-void Output::check(LValue condition, WeightedTarget taken)
-{
- check(condition, taken, taken.weight().inverse());
-}
-
-LValue Output::load(TypedPointer pointer, LoadType type)
-{
- switch (type) {
- case Load8SignExt32:
- return load8SignExt32(pointer);
- case Load8ZeroExt32:
- return load8ZeroExt32(pointer);
- case Load16SignExt32:
- return load8SignExt32(pointer);
- case Load16ZeroExt32:
- return load8ZeroExt32(pointer);
- case Load32:
- return load32(pointer);
- case Load64:
- return load64(pointer);
- case LoadPtr:
- return loadPtr(pointer);
- case LoadFloat:
- return loadFloat(pointer);
- case LoadDouble:
- return loadDouble(pointer);
- }
- RELEASE_ASSERT_NOT_REACHED();
- return nullptr;
-}
-
-void Output::store(LValue value, TypedPointer pointer, StoreType type)
-{
- switch (type) {
- case Store32As8:
- store32As8(value, pointer);
- return;
- case Store32As16:
- store32As16(value, pointer);
- return;
- case Store32:
- store32(value, pointer);
- return;
- case Store64:
- store64(value, pointer);
- return;
- case StorePtr:
- storePtr(value, pointer);
- return;
- case StoreFloat:
- storeFloat(value, pointer);
- return;
- case StoreDouble:
- storeDouble(value, pointer);
- return;
- }
- RELEASE_ASSERT_NOT_REACHED();
+ llvm->DisposeBuilder(m_builder);
}
} } // namespace JSC::FTL