25#define RETURN_TYPE_NAME(CamelName, string_name, number, parent_types) \
26 case AsmValueType::kAsm##CamelName: \
29#undef RETURN_TYPE_NAME
40 if (
x ==
nullptr)
return y ==
nullptr;
44 if (tavt ==
nullptr) {
59 if (
auto* tavt = that->AsValueType()) {
60 return (avt->Bitset() & tavt->Bitset()) == tavt->Bitset();
66 return as_callable->IsA(that);
74 if (value ==
nullptr) {
77 switch (value->Bitset()) {
78 case AsmValueType::kAsmInt8Array:
79 case AsmValueType::kAsmUint8Array:
81 case AsmValueType::kAsmInt16Array:
82 case AsmValueType::kAsmUint16Array:
84 case AsmValueType::kAsmInt32Array:
85 case AsmValueType::kAsmUint32Array:
86 case AsmValueType::kAsmFloat32Array:
88 case AsmValueType::kAsmFloat64Array:
97 if (value ==
nullptr) {
98 return AsmType::None();
100 switch (value->Bitset()) {
101 case AsmValueType::kAsmInt8Array:
102 case AsmValueType::kAsmUint8Array:
103 case AsmValueType::kAsmInt16Array:
104 case AsmValueType::kAsmUint16Array:
105 case AsmValueType::kAsmInt32Array:
106 case AsmValueType::kAsmUint32Array:
107 return AsmType::Intish();
108 case AsmValueType::kAsmFloat32Array:
109 return AsmType::FloatQ();
110 case AsmValueType::kAsmFloat64Array:
111 return AsmType::DoubleQ();
113 return AsmType::None();
119 if (value ==
nullptr) {
120 return AsmType::None();
122 switch (value->Bitset()) {
123 case AsmValueType::kAsmInt8Array:
124 case AsmValueType::kAsmUint8Array:
125 case AsmValueType::kAsmInt16Array:
126 case AsmValueType::kAsmUint16Array:
127 case AsmValueType::kAsmInt32Array:
128 case AsmValueType::kAsmUint32Array:
129 return AsmType::Intish();
130 case AsmValueType::kAsmFloat32Array:
131 return AsmType::FloatishDoubleQ();
132 case AsmValueType::kAsmFloat64Array:
133 return AsmType::FloatQDoubleQ();
135 return AsmType::None();
140 return other->AsCallableType() ==
this;
146 for (
size_t ii = 0; ii <
args_.size(); ++ii) {
147 ret +=
args_[ii]->Name();
148 if (ii !=
args_.size() - 1) {
162 AsmFroundType() : AsmCallableType() {}
164 bool CanBeInvokedWith(AsmType* return_type,
165 const ZoneVector<AsmType*>&
args)
override;
167 std::string Name()
override {
return "fround"; }
172 auto* Fround = zone->
New<AsmFroundType>();
173 return reinterpret_cast<AsmType*
>(Fround);
176bool AsmFroundType::CanBeInvokedWith(
AsmType* return_type,
178 if (
args.size() != 1) {
183 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) &&
184 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) {
192class AsmMinMaxType final :
public AsmCallableType {
200 bool CanBeInvokedWith(
AsmType* return_type,
201 const ZoneVector<AsmType*>&
args)
override {
206 if (
args.size() < 2) {
210 for (
size_t ii = 0; ii <
args.size(); ++ii) {
219 std::string Name()
override {
220 return "(" +
arg_->Name() +
", " +
arg_->Name() +
"...) -> " +
232 auto* MinMax = zone->
New<AsmMinMaxType>(dest, src);
233 return reinterpret_cast<AsmType*
>(MinMax);
237 auto* that = other->AsFunctionType();
238 if (that ==
nullptr) {
245 if (args_.size() != that->args_.size()) {
249 for (
size_t ii = 0; ii < args_.size(); ++ii) {
264 if (args_.size() !=
args.size()) {
268 for (
size_t ii = 0; ii < args_.size(); ++ii) {
269 if (!
args[ii]->IsA(args_[ii])) {
280 for (
size_t ii = 0; ii < overloads_.size(); ++ii) {
284 ret += overloads_[ii]->Name();
292 for (
size_t ii = 0; ii < overloads_.size(); ++ii) {
293 if (overloads_[ii]->AsCallableType()->CanBeInvokedWith(return_type,
args)) {
303 overloads_.push_back(overload);
#define RETURN_TYPE_NAME(CamelName, string_name, number, parent_types)
#define FOR_EACH_ASM_VALUE_TYPE_LIST(V)
virtual std::string Name()=0
virtual bool IsA(AsmType *other)
ZoneVector< AsmType * > args_
bool CanBeInvokedWith(AsmType *return_type, const ZoneVector< AsmType * > &args) override
bool IsA(AsmType *other) override
std::string Name() override
void AddOverload(AsmType *overload)
std::string Name() override
bool CanBeInvokedWith(AsmType *return_type, const ZoneVector< AsmType * > &args) override
static AsmType * FroundType(Zone *zone)
AsmValueType * AsValueType()
int32_t ElementSizeInBytes()
static AsmType * MinMaxType(Zone *zone, AsmType *dest, AsmType *src)
AsmCallableType * AsCallableType()
static bool IsExactly(AsmType *x, AsmType *y)
static AsmValueType * AsValueType(AsmType *type)
base::Vector< const DirectHandle< Object > > args
#define DCHECK_NOT_NULL(val)