mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-05-14 01:46:41 +00:00

Use the predicate condition instead of checkFeatures in *GenDAGISel.inc. This makes the code similar to isel pattern predicates. checkFeatures is still used by code created by SubtargetEmitter so we can't remove the string. Backends need to be careful to keep the string and predicates in sync, but I don't think that's a big issue. I haven't measured it, but this should be a compile time improvement for isel since we don't have to do any of the string processing that's inside checkFeatures. Reviewed By: kparzysz Differential Revision: https://reviews.llvm.org/D146012
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
//===--- CodeGenHwModes.h ---------------------------------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// Classes to parse and store HW mode information for instruction selection.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H
|
|
#define LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include <cassert>
|
|
#include <map>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
// HwModeId -> list of predicates (definition)
|
|
|
|
namespace llvm {
|
|
class Record;
|
|
class RecordKeeper;
|
|
|
|
struct CodeGenHwModes;
|
|
|
|
struct HwMode {
|
|
HwMode(Record *R);
|
|
StringRef Name;
|
|
std::string Features;
|
|
std::string Predicates;
|
|
void dump() const;
|
|
};
|
|
|
|
struct HwModeSelect {
|
|
HwModeSelect(Record *R, CodeGenHwModes &CGH);
|
|
typedef std::pair<unsigned, Record*> PairType;
|
|
std::vector<PairType> Items;
|
|
void dump() const;
|
|
};
|
|
|
|
struct CodeGenHwModes {
|
|
enum : unsigned { DefaultMode = 0 };
|
|
static StringRef DefaultModeName;
|
|
|
|
CodeGenHwModes(RecordKeeper &R);
|
|
unsigned getHwModeId(Record *R) const;
|
|
const HwMode &getMode(unsigned Id) const {
|
|
assert(Id != 0 && "Mode id of 0 is reserved for the default mode");
|
|
return Modes[Id-1];
|
|
}
|
|
const HwModeSelect &getHwModeSelect(Record *R) const;
|
|
unsigned getNumModeIds() const { return Modes.size()+1; }
|
|
void dump() const;
|
|
|
|
private:
|
|
RecordKeeper &Records;
|
|
DenseMap<Record *, unsigned> ModeIds; // HwMode Record -> HwModeId
|
|
std::vector<HwMode> Modes;
|
|
std::map<Record*,HwModeSelect> ModeSelects;
|
|
};
|
|
}
|
|
|
|
#endif // LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H
|