From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59670) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c9i8N-0003KU-9b for qemu-devel@nongnu.org; Wed, 23 Nov 2016 19:43:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c9i8J-0003D9-Db for qemu-devel@nongnu.org; Wed, 23 Nov 2016 19:43:27 -0500 Sender: Richard Henderson References: <1479918105-15616-1-git-send-email-joserz@linux.vnet.ibm.com> <1479918105-15616-2-git-send-email-joserz@linux.vnet.ibm.com> From: Richard Henderson Message-ID: <8988b8ba-85fb-3382-5191-440ed8405a52@twiddle.net> Date: Thu, 24 Nov 2016 01:43:18 +0100 MIME-Version: 1.0 In-Reply-To: <1479918105-15616-2-git-send-email-joserz@linux.vnet.ibm.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 1/4] target-ppc: Implement bcdcfsq. instruction List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jose Ricardo Ziviani , qemu-ppc@nongnu.org Cc: bharata@linux.vnet.ibm.com, qemu-devel@nongnu.org, nikunj@linux.vnet.ibm.com, david@gibson.dropbear.id.au On 11/23/2016 05:21 PM, Jose Ricardo Ziviani wrote: > bcdcfsq.: Decimal convert from signed quadword. It is not possible > to convert values less than 10^31-1 or greater than -10^31-1 to be > represented in packed decimal format. > > Signed-off-by: Jose Ricardo Ziviani > --- > target-ppc/helper.h | 1 + > target-ppc/int_helper.c | 45 +++++++++++++++++++++++++++++++++++++ > target-ppc/translate/vmx-impl.inc.c | 7 ++++++ > 3 files changed, 53 insertions(+) > > diff --git a/target-ppc/helper.h b/target-ppc/helper.h > index da00f0a..87f533c 100644 > --- a/target-ppc/helper.h > +++ b/target-ppc/helper.h > @@ -382,6 +382,7 @@ DEF_HELPER_3(bcdcfn, i32, avr, avr, i32) > DEF_HELPER_3(bcdctn, i32, avr, avr, i32) > DEF_HELPER_3(bcdcfz, i32, avr, avr, i32) > DEF_HELPER_3(bcdctz, i32, avr, avr, i32) > +DEF_HELPER_3(bcdcfsq, i32, avr, avr, i32) > > DEF_HELPER_2(xsadddp, void, env, i32) > DEF_HELPER_2(xssubdp, void, env, i32) > diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c > index 8886a72..751909c 100644 > --- a/target-ppc/int_helper.c > +++ b/target-ppc/int_helper.c > @@ -2874,6 +2874,51 @@ uint32_t helper_bcdctz(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps) > return cr; > } > > +uint32_t helper_bcdcfsq(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps) > +{ > + int cr; > + int i; > + int ox_flag = 0; > + uint64_t lo_value; > + uint64_t hi_value; > + uint64_t max = 0x38d7ea4c68000; This is at heart a decimal number, and should be written as such. Also, you need ULL for a 32-bit host compile. > + if (divu128(&lo_value, &hi_value, max)) { > + ox_flag = 1; > + } else if (lo_value >= max && hi_value == 0) { > + ox_flag = 1; > + } Dispense with ox_flag and set cr = CRF_SO now. > + for (i = 1; hi_value; hi_value /= 10, i++) { > + bcd_put_digit(&ret, hi_value % 10, i); > + } > + > + for (; lo_value; lo_value /= 10, i++) { > + bcd_put_digit(&ret, lo_value % 10, i); > + } How can this possibly work? You know there are 15 digits between high and low, but you continue with i++? If hi_value == 1 && lo_value == 1, this should not produce 11, but 10000000000000001. r~