LLVM: include/llvm/MCA/HardwareUnits/ResourceManager.h Source File (original) (raw)

49 ResourceStrategy(const ResourceStrategy &) = delete;

50 ResourceStrategy &operator=(const ResourceStrategy &) = delete;

51

52public:

55

56

58

59

60

61

62

64};

69

70

71

72

73 const uint64_t ResourceUnitMask;

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118 uint64_t RemovedFromNextInSequence;

119

120public:

122 : ResourceUnitMask(UnitMask), NextInSequenceMask(UnitMask),

123 RemovedFromNextInSequence(0) {}

125

128};

137

138 const unsigned ProcResourceDescIndex;

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

165

166

167

168

169

170

171

172

173

174

175

177

178

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194 const int BufferSize;

195

196

197 unsigned AvailableSlots;

198

199

200

201

202

203

204

206

207 const bool IsAGroup;

208

209

210 bool isSubResourceReady(uint64_t SubResMask) const {

211 return ReadyMask & SubResMask;

212 }

213

214public:

217

218 unsigned getProcResourceID() const { return ProcResourceDescIndex; }

219 uint64_t getResourceMask() const { return ResourceMask; }

220 uint64_t getReadyMask() const { return ReadyMask; }

221 int getBufferSize() const { return BufferSize; }

222

223 bool isBuffered() const { return BufferSize > 0; }

224 bool isInOrder() const { return BufferSize == 1; }

225

226

227 bool isADispatchHazard() const { return BufferSize == 0; }

228 bool isReserved() const { return Unavailable; }

229

230 void setReserved() { Unavailable = true; }

231 void clearReserved() { Unavailable = false; }

232

233

234

235 LLVM_ABI bool isReady(unsigned NumUnits = 1) const;

236

238

239 bool isAResourceGroup() const { return IsAGroup; }

240

241 bool containsResource(uint64_t ID) const { return ResourceMask & ID; }

242

243 void markSubResourceAsUsed(uint64_t ID) {

244 assert(isSubResourceReady(ID));

245 ReadyMask ^= ID;

246 }

247

248 void releaseSubResource(uint64_t ID) {

249 assert(!isSubResourceReady(ID));

250 ReadyMask ^= ID;

251 }

252

253 unsigned getNumUnits() const {

254 return isAResourceGroup() ? 1U : llvm::popcount(ResourceSizeMask);

255 }

256

257

258

259

260

261

262

263

264

265

267

268

269

270

271

272 bool reserveBuffer() {

273 if (BufferSize <= 0)

274 return true;

275

276 --AvailableSlots;

277 assert(AvailableSlots <= static_cast<unsigned>(BufferSize));

278 return AvailableSlots;

279 }

280

281

282 void releaseBuffer() {

283

284 if (BufferSize <= 0)

285 return;

286

287 ++AvailableSlots;

288 assert(AvailableSlots <= static_cast<unsigned>(BufferSize));

289 }

290

291#ifndef NDEBUG

292 void dump() const;

293#endif

294};

295

296

297

298

299

300

301typedef std::pair<uint64_t, uint64_t> ResourceRef;

302

303

304

305typedef std::pair<unsigned, unsigned> BufferUsageEntry;

306

307

308

309

310

311

312

313

314

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343 std::vector<std::unique_ptr> Resources;

344 std::vector<std::unique_ptr> Strategies;

345

346

347 std::vector<uint64_t> Resource2Groups;

348

349

351

352

353

355

356

357

359

360

362

363

364 uint64_t AvailableProcResUnits;

365

366

367 uint64_t ReservedResourceGroups;

368

369

370

372

373

375

376

378

381

382 unsigned getNumUnits(uint64_t ResourceID) const;

383

384

385

386 LLVM_ABI void setCustomStrategyImpl(std::unique_ptr S,

388

389public:

392

393

394

395 void setCustomStrategy(std::unique_ptr S,

396 unsigned ResourceID) {

397 assert(ResourceID < ProcResID2Mask.size() &&

398 "Invalid resource index in input!");

399 return setCustomStrategyImpl(std::move(S), ProcResID2Mask[ResourceID]);

400 }

401

402

403

404 LLVM_ABI ResourceStateEvent canBeDispatched(uint64_t ConsumedBuffers) const;

405

406

408

409

410

412

413

414

415

416

418

419

420

422

423

425

426

427

428

429

431

432 uint64_t getProcResUnitMask() const { return ProcResUnitMask; }

433 uint64_t getAvailableProcResUnits() const { return AvailableProcResUnits; }

434

435 using ResourceWithCycles = std::pair<ResourceRef, ReleaseAtCycles>;

436

437 void issueInstruction(const InstrDesc &Desc,

438 SmallVectorImpl &Pipes) {

439 if (Desc.HasPartiallyOverlappingGroups)

440 return issueInstructionImpl(Desc, Pipes);

441

442 return fastIssueInstruction(Desc, Pipes);

443 }

444

445

446

447

448

449

450

452 fastIssueInstruction(const InstrDesc &Desc,

453 SmallVectorImpl &Pipes);

454

455

456

457

458

459

461 issueInstructionImpl(const InstrDesc &Desc,

462 SmallVectorImpl &Pipes);

463

464 LLVM_ABI void cycleEvent(SmallVectorImpl &ResourcesFreed);

465

466#ifndef NDEBUG

467 void dump() const {

468 for (const std::unique_ptr &Resource : Resources)

469 Resource->dump();

470 }

471#endif

472};