1. # file : src/lang/expr_operator.cc
    2. Expr max_value(const DataType& dtype) {
    3. using namespace ir;
    4. CHECK_EQ(dtype.lanes(), 1);
    5. if (dtype.is_int()) {
    6. if (dtype.bits() == 64) {
    7. return IntImm::make(dtype, std::numeric_limits<int64_t>::max());
    8. } else if (dtype.bits() < 64) {
    9. int64_t val = 1;
    10. val = (val << (dtype.bits() - 1)) - 1;
    11. return IntImm::make(dtype, val);
    12. }
    13. } else if (dtype.is_uint()) {
    14. if (dtype.bits() == 64) {
    15. return UIntImm::make(dtype, std::numeric_limits<uint64_t>::max());
    16. } else if (dtype.bits() < 64) {
    17. uint64_t val = 1;
    18. val = (val << static_cast<uint64_t>(dtype.bits())) - 1;
    19. return UIntImm::make(dtype, val);
    20. }
    21. } else if (dtype.is_float()) {
    22. if (dtype.bits() == 64) {
    23. return FloatImm::make(dtype, std::numeric_limits<double>::max());
    24. } else if (dtype.bits() == 32) {
    25. return FloatImm::make(dtype, std::numeric_limits<float>::max());
    26. } else if (dtype.bits() == 16) {
    27. return FloatImm::make(dtype, 65504.0);
    28. }
    29. }
    30. LOG(FATAL) << "Cannot decide max_value for type" << dtype;
    31. return Expr();
    32. }
    33. Expr min_value(const DataType& dtype) {
    34. using namespace ir;
    35. CHECK_EQ(dtype.lanes(), 1);
    36. if (dtype.is_int()) {
    37. if (dtype.bits() == 64) {
    38. return IntImm::make(dtype, std::numeric_limits<int64_t>::lowest());
    39. } else if (dtype.bits() < 64) {
    40. int64_t val = 1;
    41. val = -(val << (dtype.bits() - 1));
    42. return IntImm::make(dtype, val);
    43. }
    44. } else if (dtype.is_uint()) {
    45. return UIntImm::make(dtype, 0);
    46. } else if (dtype.is_float()) {
    47. if (dtype.bits() == 64) {
    48. return FloatImm::make(dtype, std::numeric_limits<double>::lowest());
    49. } else if (dtype.bits() == 32) {
    50. return FloatImm::make(dtype, std::numeric_limits<float>::lowest());
    51. } else if (dtype.bits() == 16) {
    52. return FloatImm::make(dtype, -65504.0);
    53. }
    54. }
    55. LOG(FATAL) << "Cannot decide min_value for type" << dtype;
    56. return Expr();
    57. }