B3LegalizeMemoryOffsets.cpp [plain text]
#include "config.h"
#include "B3LegalizeMemoryOffsets.h"
#if ENABLE(B3_JIT)
#include "AirArg.h"
#include "B3InsertionSetInlines.h"
#include "B3MemoryValue.h"
#include "B3PhaseScope.h"
#include "B3ProcedureInlines.h"
#include "B3ValueInlines.h"
namespace JSC { namespace B3 {
namespace {
class LegalizeMemoryOffsets {
public:
LegalizeMemoryOffsets(Procedure& proc)
: m_proc(proc)
, m_insertionSet(proc)
{
}
void run()
{
if (!isARM64())
return;
for (BasicBlock* block : m_proc) {
for (unsigned index = 0; index < block->size(); ++index) {
MemoryValue* memoryValue = block->at(index)->as<MemoryValue>();
if (!memoryValue)
continue;
int32_t offset = memoryValue->offset();
Air::Arg::Width width = Air::Arg::widthForBytes(memoryValue->accessByteSize());
if (!Air::Arg::isValidAddrForm(offset, width)) {
Value* base = memoryValue->lastChild();
Value* offsetValue = m_insertionSet.insertIntConstant(index, memoryValue->origin(), pointerType(), offset);
Value* resolvedAddress = m_proc.add<Value>(Add, memoryValue->origin(), base, offsetValue);
m_insertionSet.insertValue(index, resolvedAddress);
memoryValue->lastChild() = resolvedAddress;
memoryValue->setOffset(0);
}
}
m_insertionSet.execute(block);
}
}
Procedure& m_proc;
InsertionSet m_insertionSet;
};
}
void legalizeMemoryOffsets(Procedure& proc)
{
PhaseScope phaseScope(proc, "legalizeMemoryOffsets");
LegalizeMemoryOffsets legalizeMemoryOffsets(proc);
legalizeMemoryOffsets.run();
}
} }
#endif // ENABLE(B3_JIT)