[LANG] Add support for PREFIX_INC and PREFIX_DEC.
This commit is contained in:
@@ -48,6 +48,7 @@ protected:
|
||||
|
||||
void set_ret(ir::value* value);
|
||||
ir::value *GenUnaryMinus(ir::value* arg);
|
||||
ir::value *GenUnaryInc(UnaryOp* arg, bool is_postfix, bool is_inc);
|
||||
|
||||
public:
|
||||
Generator(Parser* parser) : parser_(parser) {}
|
||||
|
@@ -182,6 +182,35 @@ ir::value* Generator::GenUnaryMinus(ir::value* arg) {
|
||||
return bld_->create_sub(_0, arg);
|
||||
}
|
||||
|
||||
ir::value* Generator::GenUnaryInc(UnaryOp* expr, bool is_postfix,
|
||||
bool is_inc) {
|
||||
Visit(expr->operand_);
|
||||
ir::value* arg = ret_;
|
||||
|
||||
ir::value *_1 = nullptr;
|
||||
if (arg->get_type()->is_half_ty() ||
|
||||
arg->get_type()->is_float_ty() ||
|
||||
arg->get_type()->is_double_ty())
|
||||
_1 = ir::constant_fp::get(arg->get_type(), 1.0);
|
||||
else if (arg->get_type()->is_integer_ty())
|
||||
_1 = ir::constant_int::get(arg->get_type(), 1);
|
||||
else
|
||||
error_not_implemented("data type not supported for unary inc");
|
||||
|
||||
if (is_postfix) {
|
||||
error_not_implemented("postfix inc not implemented");
|
||||
return nullptr;
|
||||
} else {
|
||||
ir::value *instr = nullptr;
|
||||
if (is_inc)
|
||||
instr = bld_->create_add(arg, _1);
|
||||
else
|
||||
instr = bld_->create_sub(arg, _1);
|
||||
mod_->set_value(arg->get_name(), instr);
|
||||
return instr;
|
||||
}
|
||||
}
|
||||
|
||||
void Generator::VisitUnaryOp(UnaryOp* unary) {
|
||||
// recursion
|
||||
Visit(unary->operand_);
|
||||
@@ -190,10 +219,10 @@ void Generator::VisitUnaryOp(UnaryOp* unary) {
|
||||
ir::type *arg_scal_ty = arg_ty->get_scalar_ty();
|
||||
// return
|
||||
switch (unary->op_) {
|
||||
case Token::PREFIX_INC: return error_not_implemented("prefix increment not implemented");
|
||||
case Token::PREFIX_DEC: return error_not_implemented("prefix decrement not implemented");
|
||||
case Token::POSTFIX_INC: return error_not_implemented("postfix increment not implemented");
|
||||
case Token::POSTFIX_DEC: return error_not_implemented("postfix decrement not implemented");
|
||||
case Token::PREFIX_INC: return set_ret(GenUnaryInc(unary, false, true));
|
||||
case Token::PREFIX_DEC: return set_ret(GenUnaryInc(unary, false, false));
|
||||
case Token::POSTFIX_INC: return set_ret(GenUnaryInc(unary, true, true));
|
||||
case Token::POSTFIX_DEC: return set_ret(GenUnaryInc(unary, true, false));
|
||||
case Token::ADDR: return error_not_implemented("unary & not implemented");
|
||||
case Token::DEREF: return set_ret(bld_->create_load(arg));
|
||||
case Token::PLUS: return error_not_implemented("unary + not implemented");
|
||||
|
Reference in New Issue
Block a user