From patchwork Sun Mar 31 17:51:13 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kenneth Zadeck X-Patchwork-Id: 232621 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 9D9292C00DA for ; Mon, 1 Apr 2013 04:51:45 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=DyXVPauBk0zahbxzW GXwGIZcevc4wMI5qbOBCpa6TSe3+QSsW06RR18W8pdXMOK3fTH0Ztun9F9yJDr0G R6WSQltox+pT5A30gk38UDeF70tq/zf8SR2T2L55+10S+sWz6TEG9BaHpMrCO2Ib 6T9J9A+vKOrztReN2MkBqPiF+4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; s=default; bh=EnPgn53KOZogrbdL0Mvvnfe FKTY=; b=KLXo0jtjmUu7t/3r4NaCB+xR5DiZYJ/M3Cu7Sjh4DtzDkEwuo0RqD+5 3gaoh1Dlbp07wX2nFLmOv85Le5ke8bJXsgmPkKrARBJQ7Fn7ZtfHXfeSzGXTMEZy BrAQbKMr60gbJWBqpDiKe6mwJDyhY5tNlkoTG56E6+NCyZRUz9QY= Received: (qmail 13776 invoked by alias); 31 Mar 2013 17:51:35 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 13761 invoked by uid 89); 31 Mar 2013 17:51:28 -0000 X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE autolearn=ham version=3.3.1 Received: from mail-vc0-f170.google.com (HELO mail-vc0-f170.google.com) (209.85.220.170) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sun, 31 Mar 2013 17:51:25 +0000 Received: by mail-vc0-f170.google.com with SMTP id lf10so1806946vcb.29 for ; Sun, 31 Mar 2013 10:51:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type:x-gm-message-state; bh=rz57EVya5JvLFtlxdJOQKbrmcoK2SN8/DCCQvyCmY24=; b=DKKyrjaee1N5escEvGg5eeuPjsHcQM8DkUE7vS6NN9PNa/+WKrYbTH5dm/S0wqPIBl EqSYH26oR7p+cxFDpH82WT7Q0U2eL94Q+vERjzuV5c1Y8bwaahrYZACY+YaFYYn7UeXo X9+6uneKHWpTxm5brQ9OkTrGUuLjl1wEW+EOA7dFnPX+cdzawjNYG741pPonRj2Axof0 JwITb1j9QK6fhBPvpB0M1JTk2KOhANaylkIIu/4DXKBDlDIc3QKV9NrYQfDygAJm/JlY +CYw2klDV4XxvNqLOlvk5PXm/64iPHS8+gLMnqUbOmtfteX784r11im7J0go/oXdXh18 FU3g== X-Received: by 10.52.23.18 with SMTP id i18mr6087413vdf.46.1364752284207; Sun, 31 Mar 2013 10:51:24 -0700 (PDT) Received: from [192.168.1.10] (pool-108-46-172-132.nycmny.fios.verizon.net. [108.46.172.132]) by mx.google.com with ESMTPS id a19sm10748928vdh.9.2013.03.31.10.51.13 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 31 Mar 2013 10:51:14 -0700 (PDT) Message-ID: <51587791.9090105@naturalbridge.com> Date: Sun, 31 Mar 2013 13:51:13 -0400 From: Kenneth Zadeck User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: Richard Biener CC: "Joseph S. Myers" , Mike Stump , gcc-patches , rdsandiford@googlemail.com, Ian Lance Taylor Subject: Re: patch to fix constant math - first small patch - patch ping for the next stage 1 References: <506C72C7.7090207@naturalbridge.com> <506D9544.7020408@naturalbridge.com> <506DD085.7080608@naturalbridge.com> <87txuaox52.fsf@talisman.home> <87lifli6oj.fsf@sandifor-thinkpad.stglab.manchester.uk.ibm.com> <87ehldi2kr.fsf@sandifor-thinkpad.stglab.manchester.uk.ibm.com> <87a9w1hzq1.fsf@sandifor-thinkpad.stglab.manchester.uk.ibm.com> <506F0C1A.5010705@naturalbridge.com> <87lifkhlo9.fsf@sandifor-thinkpad.stglab.manchester.uk.ibm.com> <506F5B50.2040800@naturalbridge.com> <512D51DE.6010005@naturalbridge.com> In-Reply-To: X-Gm-Message-State: ALoCoQlqDr74oo8f5Etlz/f10VvOaJL58U6yT7ruT6lWcdjtX+aq+vr6gHK96IQ8iaj2ul3JzZg4 X-Virus-Found: No richard, I was able to add everything except for the checking asserts. While I think that this is a reasonable idea, it is difficult to add that to a function that is defined in hwint.h because of circular includes. I could move this another file (though this appears to be the logical correct place for it), or we can do without the asserts. The context is that [sz]ext_hwi is that are used are over the compiler but are generally written out long. The wide-int class uses them also, but wide-int did not see like the right place for them to live and i believe that you suggested that i move them. ok to commit, or do you have a suggested resolution to the assert issue? kenny On 03/27/2013 10:13 AM, Richard Biener wrote: > On Wed, Feb 27, 2013 at 1:22 AM, Kenneth Zadeck > wrote: >> Here is the first of my wide int patches with joseph's comments and the >> patch rot removed. >> >> I would like to get these pre approved for the next stage 1. > + int shift = HOST_BITS_PER_WIDE_INT - (prec & > (HOST_BITS_PER_WIDE_INT - 1)); > > I think this should gcc_checking_assert that prec is not out of range > (any reason why prec is signed int and not unsigned int?) rather than > ignore bits in prec. > > +static inline HOST_WIDE_INT > +zext_hwi (HOST_WIDE_INT src, int prec) > +{ > + if (prec == HOST_BITS_PER_WIDE_INT) > + return src; > + else > + return src & (((HOST_WIDE_INT)1 > + << (prec & (HOST_BITS_PER_WIDE_INT - 1))) - 1); > +} > > likewise. Also I'm not sure I agree about the signedness of the result / src. > zext_hwi (-1, HOST_BITS_PER_WIDE_INT) < 0 is true which is odd. > > The patch misses context of uses, so I'm not sure what the above functions > are intended to do. > > Richard. > >> On 10/05/2012 08:14 PM, Joseph S. Myers wrote: >>> On Fri, 5 Oct 2012, Kenneth Zadeck wrote: >>> >>>> +# define HOST_HALF_WIDE_INT_PRINT "h" >>> This may cause problems on hosts not supporting %hd (MinGW?), and there's >>> no real need for using "h" here given the promotion of short to int; you >>> can just use "" (rather than e.g. needing special handling in xm-mingw32.h >>> like is done for HOST_LONG_LONG_FORMAT). >>> 2013-3-31 Kenneth Zadeck * hwint.h (HOST_BITS_PER_HALF_WIDE_INT, HOST_HALF_WIDE_INT, HOST_HALF_WIDE_INT_PRINT, HOST_HALF_WIDE_INT_PRINT_C, HOST_HALF_WIDE_INT_PRINT_DEC, HOST_HALF_WIDE_INT_PRINT_DEC_C, HOST_HALF_WIDE_INT_PRINT_UNSIGNED, HOST_HALF_WIDE_INT_PRINT_HEX, HOST_HALF_WIDE_INT_PRINT_HEX_PURE): New symbols. (sext_hwi, zext_hwi): New functions. diff --git a/gcc/hwint.h b/gcc/hwint.h index da62fad..b086af0 100644 --- a/gcc/hwint.h +++ b/gcc/hwint.h @@ -76,6 +76,40 @@ extern char sizeof_long_long_must_be_8[sizeof(long long) == 8 ? 1 : -1]; # endif #endif +/* Print support for half a host wide int. */ +#define HOST_BITS_PER_HALF_WIDE_INT (HOST_BITS_PER_WIDE_INT / 2) +#if HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_LONG +# define HOST_HALF_WIDE_INT long +# define HOST_HALF_WIDE_INT_PRINT HOST_LONG_FORMAT +# define HOST_HALF_WIDE_INT_PRINT_C "L" +# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d" +# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C +# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u" +# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x" +# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x" +#elif HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_INT +# define HOST_HALF_WIDE_INT int +# define HOST_HALF_WIDE_INT_PRINT "" +# define HOST_HALF_WIDE_INT_PRINT_C "" +# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d" +# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C +# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u" +# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x" +# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x" +#elif HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_SHORT +# define HOST_HALF_WIDE_INT short +# define HOST_HALF_WIDE_INT_PRINT "" +# define HOST_HALF_WIDE_INT_PRINT_C "" +# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d" +# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C +# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u" +# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x" +# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x" +#else +#error Please add support for HOST_HALF_WIDE_INT +#endif + + #define HOST_WIDE_INT_1 HOST_WIDE_INT_C(1) /* This is a magic identifier which allows GCC to figure out the type @@ -93,9 +127,13 @@ typedef HOST_WIDE_INT __gcc_host_wide_int__; # if HOST_BITS_PER_WIDE_INT == 64 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX \ "0x%" HOST_LONG_FORMAT "x%016" HOST_LONG_FORMAT "x" +# define HOST_WIDE_INT_PRINT_PADDED_HEX \ + "%016" HOST_LONG_FORMAT "x" # else # define HOST_WIDE_INT_PRINT_DOUBLE_HEX \ "0x%" HOST_LONG_FORMAT "x%08" HOST_LONG_FORMAT "x" +# define HOST_WIDE_INT_PRINT_PADDED_HEX \ + "%08" HOST_LONG_FORMAT "x" # endif #else # define HOST_WIDE_INT_PRINT HOST_LONG_LONG_FORMAT @@ -103,6 +141,8 @@ typedef HOST_WIDE_INT __gcc_host_wide_int__; /* We can assume that 'long long' is at least 64 bits. */ # define HOST_WIDE_INT_PRINT_DOUBLE_HEX \ "0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x" +# define HOST_WIDE_INT_PRINT_PADDED_HEX \ + "%016" HOST_LONG_LONG_FORMAT "x" #endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */ #define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d" @@ -276,4 +316,31 @@ extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT); extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT); extern HOST_WIDE_INT least_common_multiple (HOST_WIDE_INT, HOST_WIDE_INT); +/* Sign extend SRC starting from PREC. */ + +static inline HOST_WIDE_INT +sext_hwi (HOST_WIDE_INT src, unsigned int prec) +{ + if (prec == HOST_BITS_PER_WIDE_INT) + return src; + else + { + int shift = HOST_BITS_PER_WIDE_INT - + (prec & (HOST_BITS_PER_WIDE_INT - 1)); + return (src << shift) >> shift; + } +} + +/* Zero extend SRC starting from PREC. */ + +static inline unsigned HOST_WIDE_INT +zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec) +{ + if (prec == HOST_BITS_PER_WIDE_INT) + return src; + else + return src & (((HOST_WIDE_INT)1 + << (prec & (HOST_BITS_PER_WIDE_INT - 1))) - 1); +} + #endif /* ! GCC_HWINT_H */