# file : src/lang/expr_operator.cc
Expr max_value(const DataType& dtype) {
using namespace ir;
CHECK_EQ(dtype.lanes(), 1);
if (dtype.is_int()) {
if (dtype.bits() == 64) {
return IntImm::make(dtype, std::numeric_limits<int64_t>::max());
} else if (dtype.bits() < 64) {
int64_t val = 1;
val = (val << (dtype.bits() - 1)) - 1;
return IntImm::make(dtype, val);
}
} else if (dtype.is_uint()) {
if (dtype.bits() == 64) {
return UIntImm::make(dtype, std::numeric_limits<uint64_t>::max());
} else if (dtype.bits() < 64) {
uint64_t val = 1;
val = (val << static_cast<uint64_t>(dtype.bits())) - 1;
return UIntImm::make(dtype, val);
}
} else if (dtype.is_float()) {
if (dtype.bits() == 64) {
return FloatImm::make(dtype, std::numeric_limits<double>::max());
} else if (dtype.bits() == 32) {
return FloatImm::make(dtype, std::numeric_limits<float>::max());
} else if (dtype.bits() == 16) {
return FloatImm::make(dtype, 65504.0);
}
}
LOG(FATAL) << "Cannot decide max_value for type" << dtype;
return Expr();
}
Expr min_value(const DataType& dtype) {
using namespace ir;
CHECK_EQ(dtype.lanes(), 1);
if (dtype.is_int()) {
if (dtype.bits() == 64) {
return IntImm::make(dtype, std::numeric_limits<int64_t>::lowest());
} else if (dtype.bits() < 64) {
int64_t val = 1;
val = -(val << (dtype.bits() - 1));
return IntImm::make(dtype, val);
}
} else if (dtype.is_uint()) {
return UIntImm::make(dtype, 0);
} else if (dtype.is_float()) {
if (dtype.bits() == 64) {
return FloatImm::make(dtype, std::numeric_limits<double>::lowest());
} else if (dtype.bits() == 32) {
return FloatImm::make(dtype, std::numeric_limits<float>::lowest());
} else if (dtype.bits() == 16) {
return FloatImm::make(dtype, -65504.0);
}
}
LOG(FATAL) << "Cannot decide min_value for type" << dtype;
return Expr();
}