diff --git a/vvp/arith.cc b/vvp/arith.cc index f15c80688..29ff7f299 100644 --- a/vvp/arith.cc +++ b/vvp/arith.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: arith.cc,v 1.47 2005/11/10 13:27:16 steve Exp $" +#ident "$Id: arith.cc,v 1.48 2006/01/03 06:19:31 steve Exp $" #endif # include "arith.h" @@ -67,9 +67,22 @@ vvp_arith_div::~vvp_arith_div() { } -void vvp_arith_div::wide_(vvp_net_ptr_t ptr) +void vvp_arith_div::wide4_(vvp_net_ptr_t ptr) { - assert(0); + vvp_vector2_t a2 (op_a_); + if (a2.is_NaN()) { + vvp_send_vec4(ptr.ptr()->out, x_val_); + return; + } + + vvp_vector2_t b2 (op_b_); + if (b2.is_NaN()) { + vvp_send_vec4(ptr.ptr()->out, x_val_); + return; + } + + vvp_vector2_t res2 = a2 / b2; + vvp_send_vec4(ptr.ptr()->out, vector2_to_vector4(res2, wid_)); } void vvp_arith_div::recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit) @@ -77,7 +90,7 @@ void vvp_arith_div::recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit) dispatch_operand_(ptr, bit); if (wid_ > 8 * sizeof(unsigned long)) { - wide_(ptr); + wide4_(ptr); return ; } @@ -767,6 +780,9 @@ void vvp_arith_sub_real::recv_real(vvp_net_ptr_t ptr, double bit) /* * $Log: arith.cc,v $ + * Revision 1.48 2006/01/03 06:19:31 steve + * Support wide divide nodes. + * * Revision 1.47 2005/11/10 13:27:16 steve * Handle very wide % and / operations using expanded vector2 support. * diff --git a/vvp/arith.h b/vvp/arith.h index 60c878dc4..37ec87e60 100644 --- a/vvp/arith.h +++ b/vvp/arith.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: arith.h,v 1.32 2005/07/06 04:29:25 steve Exp $" +#ident "$Id: arith.h,v 1.33 2006/01/03 06:19:31 steve Exp $" #endif # include "vvp_net.h" @@ -59,7 +59,7 @@ class vvp_arith_div : public vvp_arith_ { ~vvp_arith_div(); void recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit); private: - void wide_(vvp_net_ptr_t ptr); + void wide4_(vvp_net_ptr_t ptr); bool signed_flag_; }; @@ -233,6 +233,9 @@ class vvp_arith_sub_real : public vvp_arith_real_ { /* * $Log: arith.h,v $ + * Revision 1.33 2006/01/03 06:19:31 steve + * Support wide divide nodes. + * * Revision 1.32 2005/07/06 04:29:25 steve * Implement real valued signals and arith nodes. * diff --git a/vvp/vvp_net.cc b/vvp/vvp_net.cc index e7c1a0faa..dd74c198c 100644 --- a/vvp/vvp_net.cc +++ b/vvp/vvp_net.cc @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ident "$Id: vvp_net.cc,v 1.49 2005/11/26 17:16:05 steve Exp $" +#ident "$Id: vvp_net.cc,v 1.50 2006/01/03 06:19:31 steve Exp $" # include "config.h" # include "vvp_net.h" @@ -600,20 +600,6 @@ template T coerce_to_width(const T&that, unsigned width) return res; } -#if 0 -vvp_vector4_t coerce_to_width(const vvp_vector4_t&that, unsigned width) -{ - if (that.size() == width) - return that; - - assert(that.size() > width); - vvp_vector4_t res (width); - for (unsigned idx = 0 ; idx < width ; idx += 1) - res.set_bit(idx, that.value(idx)); - - return res; -} -#endif vvp_vector2_t::vvp_vector2_t() { @@ -628,7 +614,8 @@ vvp_vector2_t::vvp_vector2_t(unsigned long v, unsigned wid) const unsigned words = (wid_ + bits_per_word-1) / bits_per_word; vec_ = new unsigned long[words]; - for (unsigned idx = 0 ; idx < words ; idx += 1) + vec_[0] = v; + for (unsigned idx = 1 ; idx < words ; idx += 1) vec_[idx] = 0; } @@ -2140,6 +2127,9 @@ vvp_bit4_t compare_gtge_signed(const vvp_vector4_t&a, /* * $Log: vvp_net.cc,v $ + * Revision 1.50 2006/01/03 06:19:31 steve + * Support wide divide nodes. + * * Revision 1.49 2005/11/26 17:16:05 steve * Force instruction that can be indexed. *