| Index: src/IceTargetLoweringX86Base.h
|
| diff --git a/src/IceTargetLoweringX86Base.h b/src/IceTargetLoweringX86Base.h
|
| index d89d74753dfab9f136338a4895051c6b9b256b6b..c0a2d4239c8cf8250eab973bfd0f3e951e9ae11e 100644
|
| --- a/src/IceTargetLoweringX86Base.h
|
| +++ b/src/IceTargetLoweringX86Base.h
|
| @@ -582,6 +582,37 @@ protected:
|
| Context.insert(Traits::Insts::XorRMW::create(Func, DestSrc0, Src1));
|
| }
|
|
|
| + void _iaca_start() {
|
| + if (!BuildDefs::minimal())
|
| + Context.insert(Traits::Insts::IacaStart::create(Func));
|
| + }
|
| + void _iaca_end() {
|
| + if (!BuildDefs::minimal())
|
| + Context.insert(Traits::Insts::IacaEnd::create(Func));
|
| + }
|
| +
|
| + /// This class helps wrap IACA markers around the code generated by the
|
| + /// current scope. It means you don't need to put an end before each return.
|
| + class ScopedIacaMark {
|
| + ScopedIacaMark(const ScopedIacaMark &) = delete;
|
| + ScopedIacaMark &operator=(const ScopedIacaMark &) = delete;
|
| +
|
| + public:
|
| + ScopedIacaMark(TargetX86Base *Lowering) : Lowering(Lowering) {
|
| + Lowering->_iaca_start();
|
| + }
|
| + ~ScopedIacaMark() { end(); }
|
| + void end() {
|
| + if (!Lowering)
|
| + return;
|
| + Lowering->_iaca_end();
|
| + Lowering = nullptr;
|
| + }
|
| +
|
| + private:
|
| + TargetX86Base *Lowering;
|
| + };
|
| +
|
| bool optimizeScalarMul(Variable *Dest, Operand *Src0, int32_t Src1);
|
| void findRMW();
|
|
|
|
|