Example #1
0
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);
}
Example #2
0
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);
  }
}
Example #3
0
LValue Output::castToInt32(LValue value)
{
    return value->type() == B3::Int32 ? value :
        m_block->appendNew<B3::Value>(m_proc, B3::Trunc, origin(), value);
}
Example #4
0
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);
}
Example #5
0
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));
}