| Index: src/IceInst.h
|
| diff --git a/src/IceInst.h b/src/IceInst.h
|
| index 2d6d0548ef26c5d21fe1282c7dfadcf25f7d9956..72422c97b2e7af2ef2b0e8275b253888be0f35fa 100644
|
| --- a/src/IceInst.h
|
| +++ b/src/IceInst.h
|
| @@ -59,11 +59,13 @@ public:
|
| Select,
|
| Store,
|
| Switch,
|
| - FakeDef, // not part of LLVM/PNaCl bitcode
|
| - FakeUse, // not part of LLVM/PNaCl bitcode
|
| - FakeKill, // not part of LLVM/PNaCl bitcode
|
| - Target // target-specific low-level ICE
|
| - // Anything >= Target is an InstTarget subclass.
|
| + BundleLock, // not part of LLVM/PNaCl bitcode
|
| + BundleUnlock, // not part of LLVM/PNaCl bitcode
|
| + FakeDef, // not part of LLVM/PNaCl bitcode
|
| + FakeUse, // not part of LLVM/PNaCl bitcode
|
| + FakeKill, // not part of LLVM/PNaCl bitcode
|
| + Target // target-specific low-level ICE
|
| + // Anything >= Target is an InstTarget subclass.
|
| };
|
| InstKind getKind() const { return Kind; }
|
|
|
| @@ -743,6 +745,53 @@ private:
|
| ~InstUnreachable() override {}
|
| };
|
|
|
| +// BundleLock instruction. There are no operands. Contains an option
|
| +// indicating whether align_to_end is specified.
|
| +class InstBundleLock : public InstHighLevel {
|
| + InstBundleLock(const InstBundleLock &) = delete;
|
| + InstBundleLock &operator=(const InstBundleLock &) = delete;
|
| +
|
| +public:
|
| + enum Option { Opt_None, Opt_AlignToEnd };
|
| + static InstBundleLock *create(Cfg *Func, Option BundleOption) {
|
| + return new (Func->allocate<InstBundleLock>())
|
| + InstBundleLock(Func, BundleOption);
|
| + }
|
| + void emit(const Cfg *Func) const override;
|
| + void emitIAS(const Cfg * /* Func */) const override {}
|
| + void dump(const Cfg *Func) const override;
|
| + Option getOption() const { return BundleOption; }
|
| + static bool classof(const Inst *Inst) {
|
| + return Inst->getKind() == BundleLock;
|
| + }
|
| +
|
| +private:
|
| + Option BundleOption;
|
| + InstBundleLock(Cfg *Func, Option BundleOption);
|
| + ~InstBundleLock() override {}
|
| +};
|
| +
|
| +// BundleUnlock instruction. There are no operands.
|
| +class InstBundleUnlock : public InstHighLevel {
|
| + InstBundleUnlock(const InstBundleUnlock &) = delete;
|
| + InstBundleUnlock &operator=(const InstBundleUnlock &) = delete;
|
| +
|
| +public:
|
| + static InstBundleUnlock *create(Cfg *Func) {
|
| + return new (Func->allocate<InstBundleUnlock>()) InstBundleUnlock(Func);
|
| + }
|
| + void emit(const Cfg *Func) const override;
|
| + void emitIAS(const Cfg * /* Func */) const override {}
|
| + void dump(const Cfg *Func) const override;
|
| + static bool classof(const Inst *Inst) {
|
| + return Inst->getKind() == BundleUnlock;
|
| + }
|
| +
|
| +private:
|
| + explicit InstBundleUnlock(Cfg *Func);
|
| + ~InstBundleUnlock() override {}
|
| +};
|
| +
|
| // FakeDef instruction. This creates a fake definition of a variable,
|
| // which is how we represent the case when an instruction produces
|
| // multiple results. This doesn't happen with high-level ICE
|
|
|