| //===------------------- X86CustomBehaviour.cpp -----------------*-C++ -* -===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// |
| /// This file implements methods from the X86CustomBehaviour class. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "X86CustomBehaviour.h" |
| #include "TargetInfo/X86TargetInfo.h" |
| #include "X86InstrInfo.h" |
| #include "llvm/MC/TargetRegistry.h" |
| #include "llvm/Support/WithColor.h" |
| |
| namespace llvm { |
| namespace mca { |
| |
| void X86InstrPostProcess::setMemBarriers(std::unique_ptr<Instruction> &Inst, |
| const MCInst &MCI) { |
| switch (MCI.getOpcode()) { |
| case X86::MFENCE: |
| Inst->setLoadBarrier(true); |
| Inst->setStoreBarrier(true); |
| break; |
| case X86::LFENCE: |
| Inst->setLoadBarrier(true); |
| break; |
| case X86::SFENCE: |
| Inst->setStoreBarrier(true); |
| break; |
| } |
| } |
| |
| void X86InstrPostProcess::postProcessInstruction( |
| std::unique_ptr<Instruction> &Inst, const MCInst &MCI) { |
| // Currently, we only modify certain instructions' IsALoadBarrier and |
| // IsAStoreBarrier flags. |
| setMemBarriers(Inst, MCI); |
| } |
| |
| } // namespace mca |
| } // namespace llvm |
| |
| using namespace llvm; |
| using namespace mca; |
| |
| static InstrPostProcess *createX86InstrPostProcess(const MCSubtargetInfo &STI, |
| const MCInstrInfo &MCII) { |
| return new X86InstrPostProcess(STI, MCII); |
| } |
| |
| /// Extern function to initialize the targets for the X86 backend |
| |
| extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86TargetMCA() { |
| TargetRegistry::RegisterInstrPostProcess(getTheX86_32Target(), |
| createX86InstrPostProcess); |
| TargetRegistry::RegisterInstrPostProcess(getTheX86_64Target(), |
| createX86InstrPostProcess); |
| } |