Modified: trunk/Source/_javascript_Core/wasm/WasmB3IRGenerator.cpp (214528 => 214529)
--- trunk/Source/_javascript_Core/wasm/WasmB3IRGenerator.cpp 2017-03-29 04:13:03 UTC (rev 214528)
+++ trunk/Source/_javascript_Core/wasm/WasmB3IRGenerator.cpp 2017-03-29 05:32:45 UTC (rev 214529)
@@ -53,6 +53,7 @@
#include "WasmExceptionType.h"
#include "WasmFunctionParser.h"
#include "WasmMemory.h"
+#include "WasmOpcodeOrigin.h"
#include <wtf/Optional.h>
void dumpProcedure(void* ptr)
@@ -204,14 +205,15 @@
PartialResult WARN_UNUSED_RETURN addUnreachable();
void dump(const Vector<ControlEntry>& controlStack, const ExpressionList* expressionStack);
+ void setParser(FunctionParser<B3IRGenerator>* parser) { m_parser = parser; };
+private:
void emitExceptionCheck(CCallHelpers&, ExceptionType);
-private:
ExpressionType emitCheckAndPreparePointer(ExpressionType pointer, uint32_t offset, uint32_t sizeOfOp);
B3::Kind memoryKind(B3::Opcode memoryOp);
- ExpressionType emitLoadOp(LoadOpType, Origin, ExpressionType pointer, uint32_t offset);
- void emitStoreOp(StoreOpType, Origin, ExpressionType pointer, ExpressionType value, uint32_t offset);
+ ExpressionType emitLoadOp(LoadOpType, ExpressionType pointer, uint32_t offset);
+ void emitStoreOp(StoreOpType, ExpressionType pointer, ExpressionType value, uint32_t offset);
void unify(Variable* target, const ExpressionType source);
void unifyValuesWithBlock(const ExpressionList& resultStack, ResultList& stack);
@@ -223,7 +225,10 @@
void restoreWasmContext(Procedure&, BasicBlock*, Value*);
void restoreWebAssemblyGlobalState(const MemoryInformation&, Value* instance, Procedure&, BasicBlock*);
+ Origin origin();
+
VM& m_vm;
+ FunctionParser<B3IRGenerator>* m_parser;
const ModuleInformation& m_info;
MemoryMode m_mode;
Procedure& m_proc;
@@ -230,6 +235,7 @@
BasicBlock* m_currentBlock;
Vector<Variable*> m_locals;
Vector<UnlinkedWasmToWasmCall>& m_unlinkedWasmToWasmCalls; // List each call site and the function index whose address it should be patched with.
+ Vector<std::unique_ptr<OpcodeOrigin>> m_origins;
GPRReg m_memoryBaseGPR;
GPRReg m_memorySizeGPR;
GPRReg m_wasmContextGPR;
@@ -339,24 +345,6 @@
m_instanceValue = materializeWasmContext(m_proc, m_currentBlock);
}
-struct MemoryBaseAndSize {
- Value* base;
- Value* size;
-};
-
-static MemoryBaseAndSize getMemoryBaseAndSize(Value* instance, Procedure& proc, BasicBlock* block)
-{
- Value* memoryObject = block->appendNew<MemoryValue>(proc, Load, pointerType(), Origin(), instance, JSWebAssemblyInstance::offsetOfMemory());
-
- static_assert(sizeof(decltype(static_cast<JSWebAssemblyInstance*>(nullptr)->memory()->memory().memory())) == sizeof(void*), "codegen relies on this size");
- static_assert(sizeof(decltype(static_cast<JSWebAssemblyInstance*>(nullptr)->memory()->memory().size())) == sizeof(uint64_t), "codegen relies on this size");
- MemoryBaseAndSize result;
- result.base = block->appendNew<MemoryValue>(proc, Load, pointerType(), Origin(), memoryObject, JSWebAssemblyMemory::offsetOfMemory());
- result.size = block->appendNew<MemoryValue>(proc, Load, Int64, Origin(), memoryObject, JSWebAssemblyMemory::offsetOfSize());
-
- return result;
-}
-
void B3IRGenerator::restoreWebAssemblyGlobalState(const MemoryInformation& memory, Value* instance, Procedure& proc, BasicBlock* block)
{
restoreWasmContext(proc, block, instance);
@@ -368,7 +356,7 @@
for (auto info : pinnedRegs->sizeRegisters)
clobbers.set(info.sizeRegister);
- B3::PatchpointValue* patchpoint = block->appendNew<B3::PatchpointValue>(proc, B3::Void, Origin());
+ B3::PatchpointValue* patchpoint = block->appendNew<B3::PatchpointValue>(proc, B3::Void, origin());
Effects effects = Effects::none();
effects.writesPinned = true;
effects.reads = B3::HeapRange::top();
@@ -417,7 +405,7 @@
for (uint32_t i = 0; i < count; ++i) {
Variable* local = m_proc.addVariable(toB3Type(type));
m_locals.uncheckedAppend(local);
- m_currentBlock->appendNew<VariableValue>(m_proc, Set, Origin(), local, zeroForType(type));
+ m_currentBlock->appendNew<VariableValue>(m_proc, Set, origin(), local, zeroForType(type));
}
return { };
}
@@ -440,13 +428,13 @@
auto B3IRGenerator::getLocal(uint32_t index, ExpressionType& result) -> PartialResult
{
ASSERT(m_locals[index]);
- result = m_currentBlock->appendNew<VariableValue>(m_proc, B3::Get, Origin(), m_locals[index]);
+ result = m_currentBlock->appendNew<VariableValue>(m_proc, B3::Get, origin(), m_locals[index]);
return { };
}
auto B3IRGenerator::addUnreachable() -> PartialResult
{
- B3::PatchpointValue* unreachable = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, Origin());
+ B3::PatchpointValue* unreachable = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, origin());
unreachable->setGenerator([this] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::Unreachable);
});
@@ -474,9 +462,9 @@
return result.pageCount();
};
- result = m_currentBlock->appendNew<CCallValue>(m_proc, Int32, Origin(),
- m_currentBlock->appendNew<ConstPtrValue>(m_proc, Origin(), bitwise_cast<void*>(growMemory)),
- m_currentBlock->appendNew<B3::Value>(m_proc, B3::FramePointer, Origin()), m_instanceValue, delta);
+ result = m_currentBlock->appendNew<CCallValue>(m_proc, Int32, origin(),
+ m_currentBlock->appendNew<ConstPtrValue>(m_proc, origin(), bitwise_cast<void*>(growMemory)),
+ m_currentBlock->appendNew<B3::Value>(m_proc, B3::FramePointer, origin()), m_instanceValue, delta);
restoreWebAssemblyGlobalState(m_info.memory, m_instanceValue, m_proc, m_currentBlock);
@@ -485,14 +473,17 @@
auto B3IRGenerator::addCurrentMemory(ExpressionType& result) -> PartialResult
{
- auto memoryValue = getMemoryBaseAndSize(m_instanceValue, m_proc, m_currentBlock);
+ Value* memoryObject = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfMemory());
+ static_assert(sizeof(decltype(static_cast<JSWebAssemblyInstance*>(nullptr)->memory()->memory().size())) == sizeof(uint64_t), "codegen relies on this size");
+ Value* size = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int64, origin(), memoryObject, JSWebAssemblyMemory::offsetOfSize());
+
constexpr uint32_t shiftValue = 16;
static_assert(PageCount::pageSize == 1 << shiftValue, "This must hold for the code below to be correct.");
- Value* numPages = m_currentBlock->appendNew<Value>(m_proc, ZShr, Origin(),
- memoryValue.size, m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), shiftValue));
+ Value* numPages = m_currentBlock->appendNew<Value>(m_proc, ZShr, origin(),
+ size, m_currentBlock->appendNew<Const32Value>(m_proc, origin(), shiftValue));
- result = m_currentBlock->appendNew<Value>(m_proc, Trunc, Origin(), numPages);
+ result = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin(), numPages);
return { };
}
@@ -500,14 +491,14 @@
auto B3IRGenerator::setLocal(uint32_t index, ExpressionType value) -> PartialResult
{
ASSERT(m_locals[index]);
- m_currentBlock->appendNew<VariableValue>(m_proc, B3::Set, Origin(), m_locals[index], value);
+ m_currentBlock->appendNew<VariableValue>(m_proc, B3::Set, origin(), m_locals[index], value);
return { };
}
auto B3IRGenerator::getGlobal(uint32_t index, ExpressionType& result) -> PartialResult
{
- Value* globalsArray = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfGlobals());
- result = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, toB3Type(m_info.globals[index].type), Origin(), globalsArray, index * sizeof(Register));
+ Value* globalsArray = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfGlobals());
+ result = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, toB3Type(m_info.globals[index].type), origin(), globalsArray, index * sizeof(Register));
return { };
}
@@ -514,8 +505,8 @@
auto B3IRGenerator::setGlobal(uint32_t index, ExpressionType value) -> PartialResult
{
ASSERT(toB3Type(m_info.globals[index].type) == value->type());
- Value* globalsArray = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfGlobals());
- m_currentBlock->appendNew<MemoryValue>(m_proc, Store, Origin(), value, globalsArray, index * sizeof(Register));
+ Value* globalsArray = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfGlobals());
+ m_currentBlock->appendNew<MemoryValue>(m_proc, Store, origin(), value, globalsArray, index * sizeof(Register));
return { };
}
@@ -525,10 +516,10 @@
if (m_mode == MemoryMode::BoundsChecking) {
ASSERT(m_memorySizeGPR);
ASSERT(sizeOfOperation + offset > offset);
- m_currentBlock->appendNew<WasmBoundsCheckValue>(m_proc, Origin(), pointer, m_memorySizeGPR, sizeOfOperation + offset - 1);
+ m_currentBlock->appendNew<WasmBoundsCheckValue>(m_proc, origin(), pointer, m_memorySizeGPR, sizeOfOperation + offset - 1);
}
- pointer = m_currentBlock->appendNew<Value>(m_proc, ZExt32, Origin(), pointer);
- return m_currentBlock->appendNew<WasmAddressValue>(m_proc, Origin(), pointer, m_memoryBaseGPR);
+ pointer = m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin(), pointer);
+ return m_currentBlock->appendNew<WasmAddressValue>(m_proc, origin(), pointer, m_memoryBaseGPR);
}
inline uint32_t sizeOfLoadOp(LoadOpType op)
@@ -563,74 +554,74 @@
return memoryOp;
}
-inline Value* B3IRGenerator::emitLoadOp(LoadOpType op, Origin origin, ExpressionType pointer, uint32_t offset)
+inline Value* B3IRGenerator::emitLoadOp(LoadOpType op, ExpressionType pointer, uint32_t offset)
{
switch (op) {
case LoadOpType::I32Load8S: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8S), origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8S), origin(), pointer, offset);
}
case LoadOpType::I64Load8S: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8S), origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value);
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8S), origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin(), value);
}
case LoadOpType::I32Load8U: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8Z), origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8Z), origin(), pointer, offset);
}
case LoadOpType::I64Load8U: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8Z), origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value);
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load8Z), origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin(), value);
}
case LoadOpType::I32Load16S: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin(), pointer, offset);
}
case LoadOpType::I64Load16S: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value);
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin(), value);
}
case LoadOpType::I32Load: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin(), pointer, offset);
}
case LoadOpType::I64Load32U: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value);
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin(), value);
}
case LoadOpType::I64Load32S: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value);
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int32, origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin(), value);
}
case LoadOpType::I64Load: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int64, origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Int64, origin(), pointer, offset);
}
case LoadOpType::F32Load: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Float, origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Float, origin(), pointer, offset);
}
case LoadOpType::F64Load: {
- return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Double, origin, pointer, offset);
+ return m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load), Double, origin(), pointer, offset);
}
// FIXME: B3 doesn't support Load16Z yet. We should lower to that value when
// it's added. https://bugs.webkit.org/show_bug.cgi?id=165884
case LoadOpType::I32Load16U: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin, pointer, offset);
- return m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value,
- m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff));
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin(), pointer, offset);
+ return m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(), value,
+ m_currentBlock->appendNew<Const32Value>(m_proc, origin(), 0x0000ffff));
}
case LoadOpType::I64Load16U: {
- Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin, pointer, offset);
- Value* partialResult = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value,
- m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff));
+ Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Load16S), origin(), pointer, offset);
+ Value* partialResult = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(), value,
+ m_currentBlock->appendNew<Const32Value>(m_proc, origin(), 0x0000ffff));
- return m_currentBlock->appendNew<Value>(m_proc, ZExt32, Origin(), partialResult);
+ return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin(), partialResult);
}
}
RELEASE_ASSERT_NOT_REACHED();
@@ -643,7 +634,7 @@
if (UNLIKELY(sumOverflows<uint32_t>(offset, sizeOfLoadOp(op)))) {
// FIXME: Even though this is provably out of bounds, it's not a validation error, so we have to handle it
// as a runtime exception. However, this may change: https://bugs.webkit.org/show_bug.cgi?id=166435
- B3::PatchpointValue* throwException = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, Origin());
+ B3::PatchpointValue* throwException = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, origin());
throwException->setGenerator([this] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsMemoryAccess);
});
@@ -674,7 +665,7 @@
}
} else
- result = emitLoadOp(op, Origin(), emitCheckAndPreparePointer(pointer, offset, sizeOfLoadOp(op)), offset);
+ result = emitLoadOp(op, emitCheckAndPreparePointer(pointer, offset, sizeOfLoadOp(op)), offset);
return { };
}
@@ -700,27 +691,27 @@
}
-inline void B3IRGenerator::emitStoreOp(StoreOpType op, Origin origin, ExpressionType pointer, ExpressionType value, uint32_t offset)
+inline void B3IRGenerator::emitStoreOp(StoreOpType op, ExpressionType pointer, ExpressionType value, uint32_t offset)
{
switch (op) {
case StoreOpType::I64Store8:
- value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin, value);
+ value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin(), value);
FALLTHROUGH;
case StoreOpType::I32Store8:
- m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store8), origin, value, pointer, offset);
+ m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store8), origin(), value, pointer, offset);
return;
case StoreOpType::I64Store16:
- value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin, value);
+ value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin(), value);
FALLTHROUGH;
case StoreOpType::I32Store16:
- m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store16), origin, value, pointer, offset);
+ m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store16), origin(), value, pointer, offset);
return;
case StoreOpType::I64Store32:
- value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin, value);
+ value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin(), value);
FALLTHROUGH;
case StoreOpType::I64Store:
@@ -727,7 +718,7 @@
case StoreOpType::I32Store:
case StoreOpType::F32Store:
case StoreOpType::F64Store:
- m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store), origin, value, pointer, offset);
+ m_currentBlock->appendNew<MemoryValue>(m_proc, memoryKind(Store), origin(), value, pointer, offset);
return;
}
RELEASE_ASSERT_NOT_REACHED();
@@ -740,12 +731,12 @@
if (UNLIKELY(sumOverflows<uint32_t>(offset, sizeOfStoreOp(op)))) {
// FIXME: Even though this is provably out of bounds, it's not a validation error, so we have to handle it
// as a runtime exception. However, this may change: https://bugs.webkit.org/show_bug.cgi?id=166435
- B3::PatchpointValue* throwException = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, Origin());
+ B3::PatchpointValue* throwException = m_currentBlock->appendNew<B3::PatchpointValue>(m_proc, B3::Void, origin());
throwException->setGenerator([this] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsMemoryAccess);
});
} else
- emitStoreOp(op, Origin(), emitCheckAndPreparePointer(pointer, offset, sizeOfStoreOp(op)), value, offset);
+ emitStoreOp(op, emitCheckAndPreparePointer(pointer, offset, sizeOfStoreOp(op)), value, offset);
return { };
}
@@ -752,7 +743,7 @@
auto B3IRGenerator::addSelect(ExpressionType condition, ExpressionType nonZero, ExpressionType zero, ExpressionType& result) -> PartialResult
{
- result = m_currentBlock->appendNew<Value>(m_proc, B3::Select, Origin(), condition, nonZero, zero);
+ result = m_currentBlock->appendNew<Value>(m_proc, B3::Select, origin(), condition, nonZero, zero);
return { };
}
@@ -760,13 +751,13 @@
{
switch (type) {
case Wasm::I32:
- return m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), static_cast<int32_t>(value));
+ return m_currentBlock->appendNew<Const32Value>(m_proc, origin(), static_cast<int32_t>(value));
case Wasm::I64:
- return m_currentBlock->appendNew<Const64Value>(m_proc, Origin(), value);
+ return m_currentBlock->appendNew<Const64Value>(m_proc, origin(), value);
case Wasm::F32:
- return m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), bitwise_cast<float>(static_cast<int32_t>(value)));
+ return m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), bitwise_cast<float>(static_cast<int32_t>(value)));
case Wasm::F64:
- return m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), bitwise_cast<double>(value));
+ return m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), bitwise_cast<double>(value));
case Wasm::Void:
case Wasm::Func:
case Wasm::Anyfunc:
@@ -790,7 +781,7 @@
{
BasicBlock* body = m_proc.addBlock();
BasicBlock* continuation = m_proc.addBlock();
- m_currentBlock->appendNewControlValue(m_proc, Jump, Origin(), body);
+ m_currentBlock->appendNewControlValue(m_proc, Jump, origin(), body);
body->addPredecessor(m_currentBlock);
m_currentBlock = body;
return ControlData(m_proc, signature, BlockType::Loop, continuation, body);
@@ -804,7 +795,7 @@
BasicBlock* notTaken = m_proc.addBlock();
BasicBlock* continuation = m_proc.addBlock();
- m_currentBlock->appendNew<Value>(m_proc, B3::Branch, Origin(), condition);
+ m_currentBlock->appendNew<Value>(m_proc, B3::Branch, origin(), condition);
m_currentBlock->setSuccessors(FrequentedBlock(taken), FrequentedBlock(notTaken));
taken->addPredecessor(m_currentBlock);
notTaken->addPredecessor(m_currentBlock);
@@ -817,7 +808,7 @@
auto B3IRGenerator::addElse(ControlData& data, const ExpressionList& currentStack) -> PartialResult
{
unifyValuesWithBlock(currentStack, data.result);
- m_currentBlock->appendNewControlValue(m_proc, Jump, Origin(), data.continuation);
+ m_currentBlock->appendNewControlValue(m_proc, Jump, origin(), data.continuation);
return addElseToUnreachable(data);
}
@@ -833,9 +824,9 @@
{
ASSERT(returnValues.size() <= 1);
if (returnValues.size())
- m_currentBlock->appendNewControlValue(m_proc, B3::Return, Origin(), returnValues[0]);
+ m_currentBlock->appendNewControlValue(m_proc, B3::Return, origin(), returnValues[0]);
else
- m_currentBlock->appendNewControlValue(m_proc, B3::Return, Origin());
+ m_currentBlock->appendNewControlValue(m_proc, B3::Return, origin());
return { };
}
@@ -847,13 +838,13 @@
BasicBlock* target = data.targetBlockForBranch();
if (condition) {
BasicBlock* continuation = m_proc.addBlock();
- m_currentBlock->appendNew<Value>(m_proc, B3::Branch, Origin(), condition);
+ m_currentBlock->appendNew<Value>(m_proc, B3::Branch, origin(), condition);
m_currentBlock->setSuccessors(FrequentedBlock(target), FrequentedBlock(continuation));
target->addPredecessor(m_currentBlock);
continuation->addPredecessor(m_currentBlock);
m_currentBlock = continuation;
} else {
- m_currentBlock->appendNewControlValue(m_proc, Jump, Origin(), FrequentedBlock(target));
+ m_currentBlock->appendNewControlValue(m_proc, Jump, origin(), FrequentedBlock(target));
target->addPredecessor(m_currentBlock);
}
@@ -866,7 +857,7 @@
unifyValuesWithBlock(expressionStack, targets[i]->result);
unifyValuesWithBlock(expressionStack, defaultTarget.result);
- SwitchValue* switchValue = m_currentBlock->appendNew<SwitchValue>(m_proc, Origin(), condition);
+ SwitchValue* switchValue = m_currentBlock->appendNew<SwitchValue>(m_proc, origin(), condition);
switchValue->setFallThrough(FrequentedBlock(defaultTarget.targetBlockForBranch()));
for (size_t i = 0; i < targets.size(); ++i)
switchValue->appendCase(SwitchCase(i, FrequentedBlock(targets[i]->targetBlockForBranch())));
@@ -879,7 +870,7 @@
ControlData& data = ""
unifyValuesWithBlock(expressionStack, data.result);
- m_currentBlock->appendNewControlValue(m_proc, Jump, Origin(), data.continuation);
+ m_currentBlock->appendNewControlValue(m_proc, Jump, origin(), data.continuation);
data.continuation->addPredecessor(m_currentBlock);
return addEndToUnreachable(entry);
@@ -892,12 +883,12 @@
m_currentBlock = data.continuation;
if (data.type() == BlockType::If) {
- data.special->appendNewControlValue(m_proc, Jump, Origin(), m_currentBlock);
+ data.special->appendNewControlValue(m_proc, Jump, origin(), m_currentBlock);
m_currentBlock->addPredecessor(data.special);
}
for (Variable* result : data.result)
- entry.enclosedExpressionStack.append(m_currentBlock->appendNew<VariableValue>(m_proc, B3::Get, Origin(), result));
+ entry.enclosedExpressionStack.append(m_currentBlock->appendNew<VariableValue>(m_proc, B3::Get, origin(), result));
// TopLevel does not have any code after this so we need to make sure we emit a return here.
if (data.type() == BlockType::TopLevel)
@@ -915,16 +906,16 @@
if (m_info.isImportedFunctionFromFunctionIndexSpace(functionIndex)) {
// FIXME imports can be linked here, instead of generating a patchpoint, because all import stubs are generated before B3 compilation starts. https://bugs.webkit.org/show_bug.cgi?id=166462
- Value* functionImport = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfImportFunction(functionIndex));
- Value* jsTypeOfImport = m_currentBlock->appendNew<MemoryValue>(m_proc, Load8Z, Origin(), functionImport, JSCell::typeInfoTypeOffset());
- Value* isWasmCall = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), jsTypeOfImport, m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), WebAssemblyFunctionType));
+ Value* functionImport = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(), m_instanceValue, JSWebAssemblyInstance::offsetOfImportFunction(functionIndex));
+ Value* jsTypeOfImport = m_currentBlock->appendNew<MemoryValue>(m_proc, Load8Z, origin(), functionImport, JSCell::typeInfoTypeOffset());
+ Value* isWasmCall = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), jsTypeOfImport, m_currentBlock->appendNew<Const32Value>(m_proc, origin(), WebAssemblyFunctionType));
BasicBlock* isWasmBlock = m_proc.addBlock();
BasicBlock* isJSBlock = m_proc.addBlock();
BasicBlock* continuation = m_proc.addBlock();
- m_currentBlock->appendNewControlValue(m_proc, B3::Branch, Origin(), isWasmCall, FrequentedBlock(isWasmBlock), FrequentedBlock(isJSBlock));
+ m_currentBlock->appendNewControlValue(m_proc, B3::Branch, origin(), isWasmCall, FrequentedBlock(isWasmBlock), FrequentedBlock(isJSBlock));
- Value* wasmCallResult = wasmCallingConvention().setupCall(m_proc, isWasmBlock, Origin(), args, toB3Type(returnType),
+ Value* wasmCallResult = wasmCallingConvention().setupCall(m_proc, isWasmBlock, origin(), args, toB3Type(returnType),
[=] (PatchpointValue* patchpoint) {
patchpoint->effects.writesPinned = true;
patchpoint->effects.readsPinned = true;
@@ -937,10 +928,10 @@
});
});
});
- UpsilonValue* wasmCallResultUpsilon = returnType == Void ? nullptr : isWasmBlock->appendNew<UpsilonValue>(m_proc, Origin(), wasmCallResult);
- isWasmBlock->appendNewControlValue(m_proc, Jump, Origin(), continuation);
+ UpsilonValue* wasmCallResultUpsilon = returnType == Void ? nullptr : isWasmBlock->appendNew<UpsilonValue>(m_proc, origin(), wasmCallResult);
+ isWasmBlock->appendNewControlValue(m_proc, Jump, origin(), continuation);
- Value* jsCallResult = wasmCallingConvention().setupCall(m_proc, isJSBlock, Origin(), args, toB3Type(returnType),
+ Value* jsCallResult = wasmCallingConvention().setupCall(m_proc, isJSBlock, origin(), args, toB3Type(returnType),
[=] (PatchpointValue* patchpoint) {
patchpoint->effects.writesPinned = true;
patchpoint->effects.readsPinned = true;
@@ -953,8 +944,8 @@
});
});
});
- UpsilonValue* jsCallResultUpsilon = returnType == Void ? nullptr : isJSBlock->appendNew<UpsilonValue>(m_proc, Origin(), jsCallResult);
- isJSBlock->appendNewControlValue(m_proc, Jump, Origin(), continuation);
+ UpsilonValue* jsCallResultUpsilon = returnType == Void ? nullptr : isJSBlock->appendNew<UpsilonValue>(m_proc, origin(), jsCallResult);
+ isJSBlock->appendNewControlValue(m_proc, Jump, origin(), continuation);
m_currentBlock = continuation;
@@ -961,7 +952,7 @@
if (returnType == Void)
result = nullptr;
else {
- result = continuation->appendNew<Value>(m_proc, Phi, toB3Type(returnType), Origin());
+ result = continuation->appendNew<Value>(m_proc, Phi, toB3Type(returnType), origin());
wasmCallResultUpsilon->setPhi(result);
jsCallResultUpsilon->setPhi(result);
}
@@ -969,7 +960,7 @@
// The call could have been to another WebAssembly instance, and / or could have modified our Memory.
restoreWebAssemblyGlobalState(m_info.memory, m_instanceValue, m_proc, continuation);
} else {
- result = wasmCallingConvention().setupCall(m_proc, m_currentBlock, Origin(), args, toB3Type(returnType),
+ result = wasmCallingConvention().setupCall(m_proc, m_currentBlock, origin(), args, toB3Type(returnType),
[=] (PatchpointValue* patchpoint) {
patchpoint->effects.writesPinned = true;
patchpoint->effects.readsPinned = true;
@@ -996,18 +987,18 @@
ExpressionType callableFunctionBuffer;
ExpressionType callableFunctionBufferSize;
{
- ExpressionType table = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(),
+ ExpressionType table = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(),
m_instanceValue, JSWebAssemblyInstance::offsetOfTable());
- callableFunctionBuffer = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(),
+ callableFunctionBuffer = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(),
table, JSWebAssemblyTable::offsetOfFunctions());
- callableFunctionBufferSize = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, Origin(),
+ callableFunctionBufferSize = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, origin(),
table, JSWebAssemblyTable::offsetOfSize());
}
// Check the index we are looking for is valid.
{
- CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, AboveEqual, Origin(), calleeIndex, callableFunctionBufferSize));
+ CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, AboveEqual, origin(), calleeIndex, callableFunctionBufferSize));
check->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsCallIndirect);
@@ -1015,19 +1006,19 @@
}
// Compute the offset in the table index space we are looking for.
- ExpressionType offset = m_currentBlock->appendNew<Value>(m_proc, Mul, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, ZExt32, Origin(), calleeIndex),
- m_currentBlock->appendIntConstant(m_proc, Origin(), pointerType(), sizeof(CallableFunction)));
- ExpressionType callableFunction = m_currentBlock->appendNew<Value>(m_proc, Add, Origin(), callableFunctionBuffer, offset);
+ ExpressionType offset = m_currentBlock->appendNew<Value>(m_proc, Mul, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin(), calleeIndex),
+ m_currentBlock->appendIntConstant(m_proc, origin(), pointerType(), sizeof(CallableFunction)));
+ ExpressionType callableFunction = m_currentBlock->appendNew<Value>(m_proc, Add, origin(), callableFunctionBuffer, offset);
// Check that the CallableFunction is initialized. We trap if it isn't. An "invalid" SignatureIndex indicates it's not initialized.
static_assert(sizeof(CallableFunction::signatureIndex) == sizeof(uint32_t), "Load codegen assumes i32");
- ExpressionType calleeSignatureIndex = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, Origin(), callableFunction, OBJECT_OFFSETOF(CallableFunction, signatureIndex));
+ ExpressionType calleeSignatureIndex = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, origin(), callableFunction, OBJECT_OFFSETOF(CallableFunction, signatureIndex));
{
- CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(),
+ CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, Equal, origin(),
calleeSignatureIndex,
- m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), Signature::invalidIndex)));
+ m_currentBlock->appendNew<Const32Value>(m_proc, origin(), Signature::invalidIndex)));
check->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::NullTableEntry);
@@ -1036,9 +1027,9 @@
// Check the signature matches the value we expect.
{
- ExpressionType expectedSignatureIndex = m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), signatureIndex);
- CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, NotEqual, Origin(), calleeSignatureIndex, expectedSignatureIndex));
+ ExpressionType expectedSignatureIndex = m_currentBlock->appendNew<Const32Value>(m_proc, origin(), signatureIndex);
+ CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, NotEqual, origin(), calleeSignatureIndex, expectedSignatureIndex));
check->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::BadSignature);
@@ -1045,10 +1036,10 @@
});
}
- ExpressionType calleeCode = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), Origin(), callableFunction, OBJECT_OFFSETOF(CallableFunction, code));
+ ExpressionType calleeCode = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, pointerType(), origin(), callableFunction, OBJECT_OFFSETOF(CallableFunction, code));
Type returnType = signature->returnType();
- result = wasmCallingConvention().setupCall(m_proc, m_currentBlock, Origin(), args, toB3Type(returnType),
+ result = wasmCallingConvention().setupCall(m_proc, m_currentBlock, origin(), args, toB3Type(returnType),
[=] (PatchpointValue* patchpoint) {
patchpoint->effects.writesPinned = true;
patchpoint->effects.readsPinned = true;
@@ -1069,7 +1060,7 @@
void B3IRGenerator::unify(Variable* variable, ExpressionType source)
{
- m_currentBlock->appendNew<VariableValue>(m_proc, Set, Origin(), variable, source);
+ m_currentBlock->appendNew<VariableValue>(m_proc, Set, origin(), variable, source);
}
void B3IRGenerator::unifyValuesWithBlock(const ExpressionList& resultStack, ResultList& result)
@@ -1279,6 +1270,14 @@
jit.ret();
}
+auto B3IRGenerator::origin() -> Origin
+{
+ if (m_origins.isEmpty() || m_origins.last()->location != m_parser->currentOpcodeStartingOffset())
+ m_origins.append(std::make_unique<OpcodeOrigin>(m_parser->currentOpcode(), m_parser->currentOpcodeStartingOffset()));
+
+ return Origin(m_origins.last().get());
+}
+
Expected<std::unique_ptr<WasmInternalFunction>, String> parseAndCompile(VM& vm, CompilationContext& compilationContext, const uint8_t* functionStart, size_t functionLength, const Signature* signature, Vector<UnlinkedWasmToWasmCall>& unlinkedWasmToWasmCalls, const ModuleInformation& info, const Vector<SignatureIndex>& moduleSignatureIndicesToUniquedSignatureIndices, MemoryMode mode, unsigned optLevel)
{
auto result = std::make_unique<WasmInternalFunction>();
@@ -1287,6 +1286,12 @@
compilationContext.wasmEntrypointJIT = std::make_unique<CCallHelpers>(&vm);
Procedure procedure;
+
+ procedure.setOriginPrinter([] (PrintStream& out, Origin origin) {
+ if (origin.data())
+ out.print("Wasm: ", *bitwise_cast<OpcodeOrigin*>(origin.data()));
+ });
+
B3IRGenerator context(vm, info, procedure, result.get(), unlinkedWasmToWasmCalls, mode);
FunctionParser<B3IRGenerator> parser(&vm, context, functionStart, functionLength, signature, info, moduleSignatureIndicesToUniquedSignatureIndices);
WASM_FAIL_IF_HELPER_FAILS(parser.parse());
@@ -1318,9 +1323,9 @@
const B3::Type type = left->type();
{
- CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), right,
- m_currentBlock->appendIntConstant(m_proc, Origin(), type, 0)));
+ CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), right,
+ m_currentBlock->appendIntConstant(m_proc, origin(), type, 0)));
check->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::DivisionByZero);
@@ -1330,12 +1335,12 @@
if (operation == Div) {
int64_t min = type == Int32 ? std::numeric_limits<int32_t>::min() : std::numeric_limits<int64_t>::min();
- CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), left,
- m_currentBlock->appendIntConstant(m_proc, Origin(), type, min)),
- m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), right,
- m_currentBlock->appendIntConstant(m_proc, Origin(), type, -1))));
+ CheckValue* check = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), left,
+ m_currentBlock->appendIntConstant(m_proc, origin(), type, min)),
+ m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), right,
+ m_currentBlock->appendIntConstant(m_proc, origin(), type, -1))));
check->setGenerator([=] (CCallHelpers& jit, const B3::StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::IntegerOverflow);
@@ -1348,7 +1353,7 @@
{
const B3::Opcode op = Div;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1357,7 +1362,7 @@
{
const B3::Opcode op = Mod;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, chill(op), Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, chill(op), origin(), left, right);
return { };
}
@@ -1366,7 +1371,7 @@
{
const B3::Opcode op = UDiv;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1375,7 +1380,7 @@
{
const B3::Opcode op = UMod;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1384,7 +1389,7 @@
{
const B3::Opcode op = Div;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1393,7 +1398,7 @@
{
const B3::Opcode op = Mod;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, chill(op), Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, chill(op), origin(), left, right);
return { };
}
@@ -1402,7 +1407,7 @@
{
const B3::Opcode op = UDiv;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1411,7 +1416,7 @@
{
const B3::Opcode op = UMod;
emitChecksForModOrDiv(op, left, right);
- result = m_currentBlock->appendNew<Value>(m_proc, op, Origin(), left, right);
+ result = m_currentBlock->appendNew<Value>(m_proc, op, origin(), left, right);
return { };
}
@@ -1418,7 +1423,7 @@
template<>
auto B3IRGenerator::addOp<OpType::I32Ctz>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.countTrailingZeros32(params[1].gpr(), params[0].gpr());
@@ -1431,7 +1436,7 @@
template<>
auto B3IRGenerator::addOp<OpType::I64Ctz>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.countTrailingZeros64(params[1].gpr(), params[0].gpr());
@@ -1447,8 +1452,8 @@
// FIXME: This should use the popcnt instruction if SSE4 is available but we don't have code to detect SSE4 yet.
// see: https://bugs.webkit.org/show_bug.cgi?id=165363
uint32_t (*popcount)(int32_t) = [] (int32_t value) -> uint32_t { return __builtin_popcount(value); };
- Value* funcAddress = m_currentBlock->appendNew<ConstPtrValue>(m_proc, Origin(), bitwise_cast<void*>(popcount));
- result = m_currentBlock->appendNew<CCallValue>(m_proc, Int32, Origin(), Effects::none(), funcAddress, arg);
+ Value* funcAddress = m_currentBlock->appendNew<ConstPtrValue>(m_proc, origin(), bitwise_cast<void*>(popcount));
+ result = m_currentBlock->appendNew<CCallValue>(m_proc, Int32, origin(), Effects::none(), funcAddress, arg);
return { };
}
@@ -1458,8 +1463,8 @@
// FIXME: This should use the popcnt instruction if SSE4 is available but we don't have code to detect SSE4 yet.
// see: https://bugs.webkit.org/show_bug.cgi?id=165363
uint64_t (*popcount)(int64_t) = [] (int64_t value) -> uint64_t { return __builtin_popcountll(value); };
- Value* funcAddress = m_currentBlock->appendNew<ConstPtrValue>(m_proc, Origin(), bitwise_cast<void*>(popcount));
- result = m_currentBlock->appendNew<CCallValue>(m_proc, Int64, Origin(), Effects::none(), funcAddress, arg);
+ Value* funcAddress = m_currentBlock->appendNew<ConstPtrValue>(m_proc, origin(), bitwise_cast<void*>(popcount));
+ result = m_currentBlock->appendNew<CCallValue>(m_proc, Int64, origin(), Effects::none(), funcAddress, arg);
return { };
}
@@ -1466,7 +1471,7 @@
template<>
auto B3IRGenerator::addOp<F64ConvertUI64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, origin());
if (isX86())
patchpoint->numGPScratchRegisters = 1;
patchpoint->append(ConstrainedValue(arg, ValueRep::SomeRegister));
@@ -1486,7 +1491,7 @@
template<>
auto B3IRGenerator::addOp<OpType::F32ConvertUI64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, origin());
if (isX86())
patchpoint->numGPScratchRegisters = 1;
patchpoint->append(ConstrainedValue(arg, ValueRep::SomeRegister));
@@ -1506,7 +1511,7 @@
template<>
auto B3IRGenerator::addOp<OpType::F64Nearest>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.roundTowardNearestIntDouble(params[1].fpr(), params[0].fpr());
@@ -1519,7 +1524,7 @@
template<>
auto B3IRGenerator::addOp<OpType::F32Nearest>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.roundTowardNearestIntFloat(params[1].fpr(), params[0].fpr());
@@ -1532,7 +1537,7 @@
template<>
auto B3IRGenerator::addOp<OpType::F64Trunc>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Double, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.roundTowardZeroDouble(params[1].fpr(), params[0].fpr());
@@ -1545,7 +1550,7 @@
template<>
auto B3IRGenerator::addOp<OpType::F32Trunc>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Float, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.roundTowardZeroFloat(params[1].fpr(), params[0].fpr());
@@ -1558,17 +1563,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I32TruncSF64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), -static_cast<double>(std::numeric_limits<int32_t>::min()));
- Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), static_cast<double>(std::numeric_limits<int32_t>::min()));
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), -static_cast<double>(std::numeric_limits<int32_t>::min()));
+ Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), static_cast<double>(std::numeric_limits<int32_t>::min()));
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateDoubleToInt32(params[1].fpr(), params[0].gpr());
@@ -1581,17 +1586,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I32TruncSF32>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), -static_cast<float>(std::numeric_limits<int32_t>::min()));
- Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), static_cast<float>(std::numeric_limits<int32_t>::min()));
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), -static_cast<float>(std::numeric_limits<int32_t>::min()));
+ Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), static_cast<float>(std::numeric_limits<int32_t>::min()));
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateFloatToInt32(params[1].fpr(), params[0].gpr());
@@ -1605,17 +1610,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I32TruncUF64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), static_cast<double>(std::numeric_limits<int32_t>::min()) * -2.0);
- Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), -1.0);
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterThan, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), static_cast<double>(std::numeric_limits<int32_t>::min()) * -2.0);
+ Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), -1.0);
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterThan, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateDoubleToUint32(params[1].fpr(), params[0].gpr());
@@ -1628,17 +1633,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I32TruncUF32>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), static_cast<float>(std::numeric_limits<int32_t>::min()) * -2.0);
- Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), -1.0);
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterThan, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), static_cast<float>(std::numeric_limits<int32_t>::min()) * -2.0);
+ Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), -1.0);
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterThan, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int32, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateFloatToUint32(params[1].fpr(), params[0].gpr());
@@ -1651,17 +1656,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I64TruncSF64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), -static_cast<double>(std::numeric_limits<int64_t>::min()));
- Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), static_cast<double>(std::numeric_limits<int64_t>::min()));
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), -static_cast<double>(std::numeric_limits<int64_t>::min()));
+ Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), static_cast<double>(std::numeric_limits<int64_t>::min()));
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateDoubleToInt64(params[1].fpr(), params[0].gpr());
@@ -1674,13 +1679,13 @@
template<>
auto B3IRGenerator::addOp<OpType::I64TruncUF64>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), static_cast<double>(std::numeric_limits<int64_t>::min()) * -2.0);
- Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), -1.0);
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterThan, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), static_cast<double>(std::numeric_limits<int64_t>::min()) * -2.0);
+ Value* min = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), -1.0);
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterThan, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
@@ -1690,9 +1695,9 @@
// Since x86 doesn't have an instruction to convert floating points to unsigned integers, we at least try to do the smart thing if
// the numbers are would be positive anyway as a signed integer. Since we cannot materialize constants into fprs we have b3 do it
// so we can pool them if needed.
- constant = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, Origin(), static_cast<double>(std::numeric_limits<uint64_t>::max() - std::numeric_limits<int64_t>::max()));
+ constant = m_currentBlock->appendNew<ConstDoubleValue>(m_proc, origin(), static_cast<double>(std::numeric_limits<uint64_t>::max() - std::numeric_limits<int64_t>::max()));
}
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
if (isX86()) {
patchpoint->append(constant, ValueRep::SomeRegister);
@@ -1716,17 +1721,17 @@
template<>
auto B3IRGenerator::addOp<OpType::I64TruncSF32>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), -static_cast<float>(std::numeric_limits<int64_t>::min()));
- Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), static_cast<float>(std::numeric_limits<int64_t>::min()));
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), -static_cast<float>(std::numeric_limits<int64_t>::min()));
+ Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), static_cast<float>(std::numeric_limits<int64_t>::min()));
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterEqual, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
patchpoint->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
jit.truncateFloatToInt64(params[1].fpr(), params[0].gpr());
@@ -1739,13 +1744,13 @@
template<>
auto B3IRGenerator::addOp<OpType::I64TruncUF32>(ExpressionType arg, ExpressionType& result) -> PartialResult
{
- Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), static_cast<float>(std::numeric_limits<int64_t>::min()) * -2.0);
- Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), -1.0);
- Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(),
- m_currentBlock->appendNew<Value>(m_proc, LessThan, Origin(), arg, max),
- m_currentBlock->appendNew<Value>(m_proc, GreaterThan, Origin(), arg, min));
- outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, Origin(), outOfBounds, zeroForType(I32));
- CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, Origin(), outOfBounds);
+ Value* max = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), static_cast<float>(std::numeric_limits<int64_t>::min()) * -2.0);
+ Value* min = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), -1.0);
+ Value* outOfBounds = m_currentBlock->appendNew<Value>(m_proc, BitAnd, origin(),
+ m_currentBlock->appendNew<Value>(m_proc, LessThan, origin(), arg, max),
+ m_currentBlock->appendNew<Value>(m_proc, GreaterThan, origin(), arg, min));
+ outOfBounds = m_currentBlock->appendNew<Value>(m_proc, Equal, origin(), outOfBounds, zeroForType(I32));
+ CheckValue* trap = m_currentBlock->appendNew<CheckValue>(m_proc, Check, origin(), outOfBounds);
trap->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams&) {
this->emitExceptionCheck(jit, ExceptionType::OutOfBoundsTrunc);
});
@@ -1755,9 +1760,9 @@
// Since x86 doesn't have an instruction to convert floating points to unsigned integers, we at least try to do the smart thing if
// the numbers are would be positive anyway as a signed integer. Since we cannot materialize constants into fprs we have b3 do it
// so we can pool them if needed.
- constant = m_currentBlock->appendNew<ConstFloatValue>(m_proc, Origin(), static_cast<float>(std::numeric_limits<uint64_t>::max() - std::numeric_limits<int64_t>::max()));
+ constant = m_currentBlock->appendNew<ConstFloatValue>(m_proc, origin(), static_cast<float>(std::numeric_limits<uint64_t>::max() - std::numeric_limits<int64_t>::max()));
}
- PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, Origin());
+ PatchpointValue* patchpoint = m_currentBlock->appendNew<PatchpointValue>(m_proc, Int64, origin());
patchpoint->append(arg, ValueRep::SomeRegister);
if (isX86()) {
patchpoint->append(constant, ValueRep::SomeRegister);