mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-28 07:17:32 +00:00
Initial implementation of 'fence' instruction, the new C++0x-style replacement for llvm.memory.barrier.
This is just a LangRef entry and reading/writing/memory representation; optimizer+codegen support coming soon. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136009 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -131,6 +131,27 @@ static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) {
|
||||
}
|
||||
}
|
||||
|
||||
static AtomicOrdering GetDecodedOrdering(unsigned Val) {
|
||||
switch (Val) {
|
||||
case bitc::ORDERING_NOTATOMIC: return NotAtomic;
|
||||
case bitc::ORDERING_UNORDERED: return Unordered;
|
||||
case bitc::ORDERING_MONOTONIC: return Monotonic;
|
||||
case bitc::ORDERING_ACQUIRE: return Acquire;
|
||||
case bitc::ORDERING_RELEASE: return Release;
|
||||
case bitc::ORDERING_ACQREL: return AcquireRelease;
|
||||
default: // Map unknown orderings to sequentially-consistent.
|
||||
case bitc::ORDERING_SEQCST: return SequentiallyConsistent;
|
||||
}
|
||||
}
|
||||
|
||||
static SynchronizationScope GetDecodedSynchScope(unsigned Val) {
|
||||
switch (Val) {
|
||||
case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread;
|
||||
default: // Map unknown scopes to cross-thread.
|
||||
case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread;
|
||||
}
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
namespace {
|
||||
/// @brief A class for maintaining the slot number definition
|
||||
@@ -2534,6 +2555,18 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope]
|
||||
if (2 != Record.size())
|
||||
return Error("Invalid FENCE record");
|
||||
AtomicOrdering Ordering = GetDecodedOrdering(Record[0]);
|
||||
if (Ordering == NotAtomic || Ordering == Unordered ||
|
||||
Ordering == Monotonic)
|
||||
return Error("Invalid FENCE record");
|
||||
SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]);
|
||||
I = new FenceInst(Context, Ordering, SynchScope);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
case bitc::FUNC_CODE_INST_CALL: {
|
||||
// CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...]
|
||||
if (Record.size() < 3)
|
||||
|
@@ -101,6 +101,27 @@ static unsigned GetEncodedBinaryOpcode(unsigned Opcode) {
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned GetEncodedOrdering(AtomicOrdering Ordering) {
|
||||
switch (Ordering) {
|
||||
default: llvm_unreachable("Unknown atomic ordering");
|
||||
case NotAtomic: return bitc::ORDERING_NOTATOMIC;
|
||||
case Unordered: return bitc::ORDERING_UNORDERED;
|
||||
case Monotonic: return bitc::ORDERING_MONOTONIC;
|
||||
case Acquire: return bitc::ORDERING_ACQUIRE;
|
||||
case Release: return bitc::ORDERING_RELEASE;
|
||||
case AcquireRelease: return bitc::ORDERING_ACQREL;
|
||||
case SequentiallyConsistent: return bitc::ORDERING_SEQCST;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) {
|
||||
switch (SynchScope) {
|
||||
default: llvm_unreachable("Unknown synchronization scope");
|
||||
case SingleThread: return bitc::SYNCHSCOPE_SINGLETHREAD;
|
||||
case CrossThread: return bitc::SYNCHSCOPE_CROSSTHREAD;
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteStringRecord(unsigned Code, StringRef Str,
|
||||
unsigned AbbrevToUse, BitstreamWriter &Stream) {
|
||||
SmallVector<unsigned, 64> Vals;
|
||||
@@ -1147,6 +1168,11 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
|
||||
Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1);
|
||||
Vals.push_back(cast<StoreInst>(I).isVolatile());
|
||||
break;
|
||||
case Instruction::Fence:
|
||||
Code = bitc::FUNC_CODE_INST_FENCE;
|
||||
Vals.push_back(GetEncodedOrdering(cast<FenceInst>(I).getOrdering()));
|
||||
Vals.push_back(GetEncodedSynchScope(cast<FenceInst>(I).getSynchScope()));
|
||||
break;
|
||||
case Instruction::Call: {
|
||||
const CallInst &CI = cast<CallInst>(I);
|
||||
PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType());
|
||||
|
Reference in New Issue
Block a user