Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 lowering ----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 lowering ----*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 }; | 239 }; |
| 240 | 240 |
| 241 CondWhenTrue lowerFcmpCond(const InstFcmp *Instr); | 241 CondWhenTrue lowerFcmpCond(const InstFcmp *Instr); |
| 242 void lowerFcmp(const InstFcmp *Instr) override; | 242 void lowerFcmp(const InstFcmp *Instr) override; |
| 243 CondWhenTrue lowerInt8AndInt16IcmpCond(InstIcmp::ICond Condition, | 243 CondWhenTrue lowerInt8AndInt16IcmpCond(InstIcmp::ICond Condition, |
| 244 Operand *Src0, Operand *Src1); | 244 Operand *Src0, Operand *Src1); |
| 245 CondWhenTrue lowerInt32IcmpCond(InstIcmp::ICond Condition, Operand *Src0, | 245 CondWhenTrue lowerInt32IcmpCond(InstIcmp::ICond Condition, Operand *Src0, |
| 246 Operand *Src1); | 246 Operand *Src1); |
| 247 CondWhenTrue lowerInt64IcmpCond(InstIcmp::ICond Condition, Operand *Src0, | 247 CondWhenTrue lowerInt64IcmpCond(InstIcmp::ICond Condition, Operand *Src0, |
| 248 Operand *Src1); | 248 Operand *Src1); |
| 249 CondWhenTrue lowerIcmpCond(InstIcmp::ICond Condition, Operand *Src0, | |
| 250 Operand *Src1); | |
| 249 CondWhenTrue lowerIcmpCond(const InstIcmp *Instr); | 251 CondWhenTrue lowerIcmpCond(const InstIcmp *Instr); |
| 250 void lowerIcmp(const InstIcmp *Instr) override; | 252 void lowerIcmp(const InstIcmp *Instr) override; |
| 253 /// Emits the basic sequence for lower-linked/store-exclusive loops: | |
| 254 /// | |
| 255 /// retry: | |
| 256 /// ldrex tmp, [Addr] | |
| 257 /// StoreValue = Operation(tmp) | |
| 258 /// strexCond success, StoreValue, [Addr] | |
| 259 /// cmpCond success, #0 | |
| 260 /// bne retry | |
| 261 /// | |
| 262 /// Operation needs to return which value to strex in Addr, it must not change | |
| 263 /// the flags if Cond is not AL, and must not emit any instructions that could | |
| 264 /// 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.
| |
| 265 /// i64 handling. | |
| 266 void | |
| 267 lowerLoadLinkedStoreExclusive(Type Ty, Operand *Addr, | |
| 268 std::function<Variable *(Variable *)> Operation, | |
| 269 CondARM32::Cond Cond = CondARM32::AL); | |
| 270 void lowerInt64AtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, | |
| 271 Operand *Val); | |
| 251 void lowerAtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, | 272 void lowerAtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, |
| 252 Operand *Val); | 273 Operand *Val); |
| 253 void lowerIntrinsicCall(const InstIntrinsicCall *Instr) override; | 274 void lowerIntrinsicCall(const InstIntrinsicCall *Instr) override; |
| 254 void lowerInsertElement(const InstInsertElement *Instr) override; | 275 void lowerInsertElement(const InstInsertElement *Instr) override; |
| 255 void lowerLoad(const InstLoad *Instr) override; | 276 void lowerLoad(const InstLoad *Instr) override; |
| 256 void lowerPhi(const InstPhi *Instr) override; | 277 void lowerPhi(const InstPhi *Instr) override; |
| 257 void lowerRet(const InstRet *Instr) override; | 278 void lowerRet(const InstRet *Instr) override; |
| 258 void lowerSelect(const InstSelect *Instr) override; | 279 void lowerSelect(const InstSelect *Instr) override; |
| 259 void lowerStore(const InstStore *Instr) override; | 280 void lowerStore(const InstStore *Instr) override; |
| 260 void lowerSwitch(const InstSwitch *Instr) override; | 281 void lowerSwitch(const InstSwitch *Instr) override; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 Context.insert<InstARM32Eor>(Dest, Src0, Src1, Pred); | 374 Context.insert<InstARM32Eor>(Dest, Src0, Src1, Pred); |
| 354 } | 375 } |
| 355 /// _ldr, for all your memory to Variable data moves. It handles all types | 376 /// _ldr, for all your memory to Variable data moves. It handles all types |
| 356 /// (integer, floating point, and vectors.) Addr needs to be valid for Dest's | 377 /// (integer, floating point, and vectors.) Addr needs to be valid for Dest's |
| 357 /// type (e.g., no immediates for vector loads, and no index registers for fp | 378 /// type (e.g., no immediates for vector loads, and no index registers for fp |
| 358 /// loads.) | 379 /// loads.) |
| 359 void _ldr(Variable *Dest, OperandARM32Mem *Addr, | 380 void _ldr(Variable *Dest, OperandARM32Mem *Addr, |
| 360 CondARM32::Cond Pred = CondARM32::AL) { | 381 CondARM32::Cond Pred = CondARM32::AL) { |
| 361 Context.insert<InstARM32Ldr>(Dest, Addr, Pred); | 382 Context.insert<InstARM32Ldr>(Dest, Addr, Pred); |
| 362 } | 383 } |
| 363 void _ldrex(Variable *Dest, OperandARM32Mem *Addr, | 384 InstARM32Ldrex *_ldrex(Variable *Dest, OperandARM32Mem *Addr, |
| 364 CondARM32::Cond Pred = CondARM32::AL) { | 385 CondARM32::Cond Pred = CondARM32::AL) { |
| 365 Context.insert<InstARM32Ldrex>(Dest, Addr, Pred); | 386 auto *Ldrex = Context.insert<InstARM32Ldrex>(Dest, Addr, Pred); |
| 366 if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { | 387 if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { |
| 367 Context.insert<InstFakeDef>(Dest64->getLo(), Dest); | 388 Context.insert<InstFakeDef>(Dest64->getLo(), Dest); |
| 368 Context.insert<InstFakeDef>(Dest64->getHi(), Dest); | 389 Context.insert<InstFakeDef>(Dest64->getHi(), Dest); |
| 369 } | 390 } |
| 391 return Ldrex; | |
| 370 } | 392 } |
| 371 void _lsl(Variable *Dest, Variable *Src0, Operand *Src1, | 393 void _lsl(Variable *Dest, Variable *Src0, Operand *Src1, |
| 372 CondARM32::Cond Pred = CondARM32::AL) { | 394 CondARM32::Cond Pred = CondARM32::AL) { |
| 373 Context.insert<InstARM32Lsl>(Dest, Src0, Src1, Pred); | 395 Context.insert<InstARM32Lsl>(Dest, Src0, Src1, Pred); |
| 374 } | 396 } |
| 375 void _lsls(Variable *Dest, Variable *Src0, Operand *Src1, | 397 void _lsls(Variable *Dest, Variable *Src0, Operand *Src1, |
| 376 CondARM32::Cond Pred = CondARM32::AL) { | 398 CondARM32::Cond Pred = CondARM32::AL) { |
| 377 constexpr bool SetFlags = true; | 399 constexpr bool SetFlags = true; |
| 378 Context.insert<InstARM32Lsl>(Dest, Src0, Src1, Pred, SetFlags); | 400 Context.insert<InstARM32Lsl>(Dest, Src0, Src1, Pred, SetFlags); |
| 379 } | 401 } |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1285 private: | 1307 private: |
| 1286 ~TargetHeaderARM32() = default; | 1308 ~TargetHeaderARM32() = default; |
| 1287 | 1309 |
| 1288 TargetARM32Features CPUFeatures; | 1310 TargetARM32Features CPUFeatures; |
| 1289 }; | 1311 }; |
| 1290 | 1312 |
| 1291 } // end of namespace ARM32 | 1313 } // end of namespace ARM32 |
| 1292 } // end of namespace Ice | 1314 } // end of namespace Ice |
| 1293 | 1315 |
| 1294 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H | 1316 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H |
| OLD | NEW |