diff options
Diffstat (limited to 'llvm/lib/Target/RISCV')
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfo.td | 14 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 6 |
3 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 9f0069878d8..b98f0575caa 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -137,6 +137,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM, setOperationAction(ISD::BlockAddress, XLenVT, Custom); setOperationAction(ISD::ConstantPool, XLenVT, Custom); + // Atomic operations aren't suported in the base RV32I ISA. + setMaxAtomicSizeInBitsSupported(0); + setBooleanContents(ZeroOrOneBooleanContent); // Function alignments (log2). diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 0777efd7ea3..7dedc0ffcc1 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -743,6 +743,20 @@ defm : StPat<truncstorei8, SB, GPR>; defm : StPat<truncstorei16, SH, GPR>; defm : StPat<store, SW, GPR>; +/// Fences + +// Refer to Table A.6 in the version 2.3 draft of the RISC-V Instruction Set +// Manual: Volume I. + +// fence acquire -> fence r, rw +def : Pat<(atomic_fence (i32 4), (imm)), (FENCE 0b10, 0b11)>; +// fence release -> fence rw, w +def : Pat<(atomic_fence (i32 5), (imm)), (FENCE 0b11, 0b1)>; +// fence acq_rel -> fence.tso +def : Pat<(atomic_fence (i32 6), (imm)), (FENCE_TSO)>; +// fence seq_cst -> fence rw, rw +def : Pat<(atomic_fence (i32 7), (imm)), (FENCE 0b11, 0b11)>; + /// Other pseudo-instructions // Pessimistically assume the stack pointer will be clobbered diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index d025e82984b..29f6bead42f 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -75,6 +75,7 @@ public: return getTM<RISCVTargetMachine>(); } + void addIRPasses() override; bool addInstSelector() override; void addPreEmitPass() override; }; @@ -84,6 +85,11 @@ TargetPassConfig *RISCVTargetMachine::createPassConfig(PassManagerBase &PM) { return new RISCVPassConfig(*this, PM); } +void RISCVPassConfig::addIRPasses() { + addPass(createAtomicExpandPass()); + TargetPassConfig::addIRPasses(); +} + bool RISCVPassConfig::addInstSelector() { addPass(createRISCVISelDag(getRISCVTargetMachine())); |