Index: src/IceTargetLoweringARM32.h |
diff --git a/src/IceTargetLoweringARM32.h b/src/IceTargetLoweringARM32.h |
index 267c7667d8143d6bcf0340643b1a6b1b376c934b..afa8f30d5bec62315af3eeb044484eff440e994b 100644 |
--- a/src/IceTargetLoweringARM32.h |
+++ b/src/IceTargetLoweringARM32.h |
@@ -246,8 +246,29 @@ protected: |
Operand *Src1); |
CondWhenTrue lowerInt64IcmpCond(InstIcmp::ICond Condition, Operand *Src0, |
Operand *Src1); |
+ CondWhenTrue lowerIcmpCond(InstIcmp::ICond Condition, Operand *Src0, |
+ Operand *Src1); |
CondWhenTrue lowerIcmpCond(const InstIcmp *Instr); |
void lowerIcmp(const InstIcmp *Instr) override; |
+ /// Emits the basic sequence for lower-linked/store-exclusive loops: |
+ /// |
+ /// retry: |
+ /// ldrex tmp, [Addr] |
+ /// StoreValue = Operation(tmp) |
+ /// strexCond success, StoreValue, [Addr] |
+ /// cmpCond success, #0 |
+ /// bne retry |
+ /// |
+ /// Operation needs to return which value to strex in Addr, it must not change |
+ /// the flags if Cond is not AL, and must not emit any instructions that could |
+ /// end up writting to memory. Operation also needs to handle fake-defing for |
Jim Stichnoth
2016/02/17 03:50:17
writing
John
2016/02/17 13:01:39
Done.
|
+ /// i64 handling. |
+ void |
+ lowerLoadLinkedStoreExclusive(Type Ty, Operand *Addr, |
+ std::function<Variable *(Variable *)> Operation, |
+ CondARM32::Cond Cond = CondARM32::AL); |
+ void lowerInt64AtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, |
+ Operand *Val); |
void lowerAtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, |
Operand *Val); |
void lowerIntrinsicCall(const InstIntrinsicCall *Instr) override; |
@@ -360,13 +381,14 @@ protected: |
CondARM32::Cond Pred = CondARM32::AL) { |
Context.insert<InstARM32Ldr>(Dest, Addr, Pred); |
} |
- void _ldrex(Variable *Dest, OperandARM32Mem *Addr, |
- CondARM32::Cond Pred = CondARM32::AL) { |
- Context.insert<InstARM32Ldrex>(Dest, Addr, Pred); |
+ InstARM32Ldrex *_ldrex(Variable *Dest, OperandARM32Mem *Addr, |
+ CondARM32::Cond Pred = CondARM32::AL) { |
+ auto *Ldrex = Context.insert<InstARM32Ldrex>(Dest, Addr, Pred); |
if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { |
Context.insert<InstFakeDef>(Dest64->getLo(), Dest); |
Context.insert<InstFakeDef>(Dest64->getHi(), Dest); |
} |
+ return Ldrex; |
} |
void _lsl(Variable *Dest, Variable *Src0, Operand *Src1, |
CondARM32::Cond Pred = CondARM32::AL) { |