void SemanticAnalysis::visitAssignment(Assignment *node) { LValue lval; if (!lvalue(node->lvalue(), &lval)) return; HIR *hir = rvalue(node->expression()); if ((hir = coerce(hir, lval.type(), Coerce_Assign)) == nullptr) return; hir_ = new (pool_) HStore(node, lval.type(), node->token(), lval, hir); }
void SemanticAnalysis::visitIncDecExpression(IncDecExpression *node) { LValue lval; if (!lvalue(node->expression(), &lval)) return; Type *type = lval.type(); if (!type->isInt32() && !type->isFloat()) { assert(false); return; } if (node->postfix()) { hir_ = new (pool_) HPostIncDec(node, type, node->token(), lval); } else { HIR *rval; if (lval.type()->isInt32()) rval = new (pool_) HInteger(node, type, 1); else rval = new (pool_) HFloat(node, type, 1.0); hir_ = new (pool_) HStore(node, type, node->token(), lval, rval); } }
LValue Output::castToInt32(LValue value) { return value->type() == B3::Int32 ? value : m_block->appendNew<B3::Value>(m_proc, B3::Trunc, origin(), value); }
LValue Output::zeroExt(LValue value, LType type) { if (value->type() == type) return value; return m_block->appendNew<B3::Value>(m_proc, B3::ZExt32, origin(), value); }
LValue Output::bitNot(LValue value) { return m_block->appendNew<B3::Value>(m_proc, B3::BitXor, origin(), value, m_block->appendIntConstant(m_proc, origin(), value->type(), -1)); }