{ \
TYPE_CHECK(Any, Any); \
auto y = data.PopAny(); \
if (std::holds_alternative<uint64_t>(y)) { \
if (CHECK_ZERO && !std::get<uint64_t>(y)) \
return error(#OP
" by zero"); \
data.Push((uint64_t)(data.Pop<uint64_t>() OP std::get<uint64_t>(y))); \
} else if (std::holds_alternative<int64_t>(y)) { \
if (CHECK_ZERO && !std::get<int64_t>(y)) \
return error(#OP
" by zero"); \
TYPE_CHECK(Int); \
data.Push((int64_t)(data.Pop<int64_t>() OP std::get<int64_t>(y))); \
} else if (std::holds_alternative<llvm::APSInt>(y)) { \
TYPE_CHECK(Integer); \
llvm::APSInt rhs = std::get<llvm::APSInt>(y); \
llvm::APSInt lhs = data.Pop<llvm::APSInt>(); \
if (lhs.isUnsigned() || rhs.isUnsigned()) \
return error(
"unsupported unsigned value"); \
unsigned width = std::max(lhs.getBitWidth(), rhs.getBitWidth()); \
lhs = lhs.extend(width); \
rhs = rhs.extend(width); \
if (CHECK_ZERO && rhs.isZero()) \
return error(#OP
" by zero"); \
} else \
return
error(
"unsupported data types"); \
}
static llvm::raw_ostream & error(Stream &strm)