The signedness of a ternary expression comes from its operands.

If either of the operands of a ternary expression are unsigned, then
both are treated as unsigned. It works just like a binary expression
in that regard.
This commit is contained in:
Stephen Williams 2008-10-11 21:52:41 -07:00
parent 864a86f7ee
commit 62f518c205
2 changed files with 8 additions and 6 deletions

View File

@ -144,6 +144,8 @@ class PExpr : public LineInfo {
ivl_variable_type_t expr_type_; ivl_variable_type_t expr_type_;
unsigned expr_width_; unsigned expr_width_;
static void suppress_binary_operand_sign_if_needed_(NetExpr*lp, NetExpr*rp);
private: // not implemented private: // not implemented
PExpr(const PExpr&); PExpr(const PExpr&);
PExpr& operator= (const PExpr&); PExpr& operator= (const PExpr&);
@ -484,8 +486,6 @@ class PEBinary : public PExpr {
NetExpr*elaborate_expr_base_mult_(Design*, NetExpr*lp, NetExpr*rp, int use_wid) const; NetExpr*elaborate_expr_base_mult_(Design*, NetExpr*lp, NetExpr*rp, int use_wid) const;
NetExpr*elaborate_expr_base_add_(Design*, NetExpr*lp, NetExpr*rp, int use_wid) const; NetExpr*elaborate_expr_base_add_(Design*, NetExpr*lp, NetExpr*rp, int use_wid) const;
static void suppress_operand_sign_if_needed_(NetExpr*lp, NetExpr*rp);
}; };
/* /*

View File

@ -222,7 +222,7 @@ NetExpr* PEBinary::elaborate_expr(Design*des, NetScope*scope,
return tmp; return tmp;
} }
void PEBinary::suppress_operand_sign_if_needed_(NetExpr*lp, NetExpr*rp) void PExpr::suppress_binary_operand_sign_if_needed_(NetExpr*lp, NetExpr*rp)
{ {
// If an argument is a non-vector type, then this type // If an argument is a non-vector type, then this type
// suppression does not apply. // suppression does not apply.
@ -672,7 +672,7 @@ NetExpr* PEBinary::elaborate_expr_base_mult_(Design*des,
// If this expression is unsigned, then make sure the // If this expression is unsigned, then make sure the
// arguments are unsigned so that the padding below doesn't // arguments are unsigned so that the padding below doesn't
// cause any sign extension to happen. // cause any sign extension to happen.
suppress_operand_sign_if_needed_(lp, rp); suppress_binary_operand_sign_if_needed_(lp, rp);
// Multiply will guess a width that is the sum of the // Multiply will guess a width that is the sum of the
@ -709,7 +709,7 @@ NetExpr* PEBinary::elaborate_expr_base_add_(Design*des,
// If the expression is unsigned, then force the operands to // If the expression is unsigned, then force the operands to
// unsigned so taht the set_width below doesn't cause them to // unsigned so taht the set_width below doesn't cause them to
// be sign-extended. // be sign-extended.
suppress_operand_sign_if_needed_(lp, rp); suppress_binary_operand_sign_if_needed_(lp, rp);
tmp = new NetEBAdd(op_, lp, rp, use_lossless_flag); tmp = new NetEBAdd(op_, lp, rp, use_lossless_flag);
if (expr_wid > 0 && type_is_vectorable(tmp->expr_type())) if (expr_wid > 0 && type_is_vectorable(tmp->expr_type()))
@ -764,7 +764,7 @@ NetExpr* PEBComp::elaborate_expr(Design*des, NetScope*scope,
return 0; return 0;
} }
suppress_operand_sign_if_needed_(lp, rp); suppress_binary_operand_sign_if_needed_(lp, rp);
// The arguments of a compare need to have matching widths, so // The arguments of a compare need to have matching widths, so
// pad the width here. This matters because if the arguments // pad the width here. This matters because if the arguments
@ -2679,6 +2679,8 @@ NetExpr*PETernary::elaborate_expr(Design*des, NetScope*scope,
return 0; return 0;
} }
suppress_binary_operand_sign_if_needed_(tru, fal);
/* Whatever the width we choose for the ternary operator, we /* Whatever the width we choose for the ternary operator, we
need to make sure the operands match. */ need to make sure the operands match. */
tru = pad_to_width(tru, use_wid); tru = pad_to_width(tru, use_wid);