From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26338 invoked by alias); 28 Jun 2005 13:59:48 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 25929 invoked by uid 22791); 28 Jun 2005 13:59:27 -0000 Received: from smtp-102-tuesday.noc.nerim.net (HELO mallaury.noc.nerim.net) (62.4.17.102) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Tue, 28 Jun 2005 13:59:27 +0000 Received: from uniton.integrable-solutions.net (gdr.net1.nerim.net [62.212.99.186]) by mallaury.noc.nerim.net (Postfix) with ESMTP id C8E6D62D3A; Tue, 28 Jun 2005 15:59:23 +0200 (CEST) Received: from uniton.integrable-solutions.net (localhost [127.0.0.1]) by uniton.integrable-solutions.net (8.12.10/8.12.10/SuSE Linux 0.7) with ESMTP id j5SDwlKY003428; Tue, 28 Jun 2005 15:58:47 +0200 Received: (from gdr@localhost) by uniton.integrable-solutions.net (8.12.10/8.12.10/Submit) id j5SDwlWg003427; Tue, 28 Jun 2005 15:58:47 +0200 To: Nathan Sidwell Cc: Michael Veksler , Daniel Berlin , Mark Mitchell , Paul Koning , gcc mailing list Subject: Re: Do C++ signed types have modulo semantics? References: <42C15026.7070304@codesourcery.com> From: Gabriel Dos Reis In-Reply-To: <42C15026.7070304@codesourcery.com> Date: Tue, 28 Jun 2005 13:59:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2005-06/txt/msg01113.txt.bz2 Nathan Sidwell writes: | Gabriel Dos Reis wrote: | > Michael Veksler writes: | > [...] | > | The code is not very simple, and different codes will get optimized | > | differently. | > | The user will have to learn how to write this piece of code differently for | > | each | > | processor to have best results. | > | | int wrap_sum(int a, int b) | > | { | > | if ( (a<0) != (b<0)) | > | return a+b; // Different sign, no overflow possible. | > | unsigned sum = (unsigned) a + b; | > | if (sum <= MAX_INT) | > | return sum; | > | sum -= MIN_INT; | > | if (sum > MAX_INT) // can be eliminated for 2's complement | > | abort(); // oops | > | return (int)sum + MIN_INT; | > | } | > | | It does not look too good optimization-wise. | > Thanks for providing this example. This is the sort of thing I | > faced. With pipeline process, it does harm. | | Please explain why | int wrap_sum (int a, int b) | { | return (int) ((unsigned)a + (unsigned)b)); | } | is unacceptable Notice that in your rendition you're assuming that you can convert any unsigned value > INT_MAX to a int without invoking undefined behaviour. Thus the question is whether you're accepting that as documented behaviour of GCC, and if so, then I'm interested in which ways it would differs from saying that is_modulo is true. That is useful for improving over the current situation, may I point out. | (provided we're on the standard 2's complement machine | where the mapping between negative ints and unsigned is | *implementation defined* to be the sane mapping, which I might point | out you've already assumed in the wrap_sum I quoted). | | nathan | | and whoever silently removed gcc@gcc.gnu.org, shame on you I don't see why you should put shame on Daniel Berlin for having sent a private useful notice. -- Gaby