From patchwork Wed Aug 1 23:23:20 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 174620 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]) by ozlabs.org (Postfix) with SMTP id ACEC22C0089 for ; Thu, 2 Aug 2012 09:23:46 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1344468228; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject: References:In-Reply-To:Content-Type:Mailing-List:Precedence: List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=R3Ua8AKun0tK46NQgr7Bdk6dqEU=; b=r35cYYI99MOP0X6 wXNWmw1u2jxfuKCEW4p8chLJRhPmbgOaZ9AzNljCEcr1unPU17baqUeenXUs8s5C sXLRYXcD/ilwvHIor6GMhn7z8Th3l9Mjd7EETil4c8m3IvkdXc0Xh/oRsIULAJ9N FjBnk+sWfs6gpLrFAGUPKIhoaxu4= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=Y+wUwhF1awTes4j/QdMBoE3xK60HgdgKkYO0B5Np4UNN3b3rRldQeDGMhZftm+ VNhlIMNE7V/4Ot/bJVAyIFYMO3nL/6OLHvaiMOfar1jdZGmi7PjJLfe1NZlTy0Xm c7N5aAMY9cCnmPjiRnMT2yeHGzHviQfCPkpSceUuNY11Y=; Received: (qmail 31281 invoked by alias); 1 Aug 2012 23:23:45 -0000 Received: (qmail 31271 invoked by uid 22791); 1 Aug 2012 23:23:43 -0000 X-SWARE-Spam-Status: No, hits=-7.0 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 01 Aug 2012 23:23:25 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q71NNMvT028778 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 1 Aug 2012 19:23:22 -0400 Received: from pebble.twiddle.home (vpn-9-22.rdu.redhat.com [10.11.9.22]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q71NNLca018066; Wed, 1 Aug 2012 19:23:22 -0400 Message-ID: <5019BA68.5070709@redhat.com> Date: Wed, 01 Aug 2012 16:23:20 -0700 From: Richard Henderson User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Ulrich Weigand CC: gcc-patches@gcc.gnu.org Subject: Re: [PATCH 0/2] Convert s390 to atomic optabs, v2 References: <201207311817.q6VIHH8e000866@d06av02.portsmouth.uk.ibm.com> In-Reply-To: <201207311817.q6VIHH8e000866@d06av02.portsmouth.uk.ibm.com> X-IsSubscribed: yes 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 Please try this as a followup to the previous two patches. That should clean up the mistake with the insv change. r~ commit 6b07a31943bcbca2a4f6fae707cf3d7ae283d4dc Author: Richard Henderson Date: Wed Aug 1 16:10:37 2012 -0700 fixup insv diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 8259e2b..35c7fb5 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -4551,7 +4551,8 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) int bitsize = INTVAL (op1); int bitpos = INTVAL (op2); enum machine_mode mode = GET_MODE (dest); - enum machine_mode smode = smallest_mode_for_size (bitsize, MODE_INT); + enum machine_mode smode; + int smode_bsize, mode_bsize; rtx op, clobber; /* Generate INSERT IMMEDIATE (IILL et al). */ @@ -4587,6 +4588,10 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) return true; } + smode = smallest_mode_for_size (bitsize, MODE_INT); + smode_bsize = GET_MODE_BITSIZE (smode); + mode_bsize = GET_MODE_BITSIZE (mode); + /* Generate STORE CHARACTERS UNDER MASK (STCM et al). */ if (bitpos == 0 && (bitsize % BITS_PER_UNIT) == 0 @@ -4595,7 +4600,7 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) || const_int_operand (src, VOIDmode))) { /* Emit standard pattern if possible. */ - if (GET_MODE_BITSIZE (smode) == bitsize) + if (smode_bsize == bitsize) { emit_move_insn (adjust_address (dest, smode, 0), gen_lowpart (smode, src)); @@ -4608,7 +4613,7 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) int size = bitsize / BITS_PER_UNIT; rtx src_mem = adjust_address (force_const_mem (word_mode, src), BLKmode, - GET_MODE_SIZE (word_mode) - size); + UNITS_PER_WORD - size); dest = adjust_address (dest, BLKmode, 0); set_mem_size (dest, size); @@ -4619,22 +4624,22 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) /* (set (ze (mem)) (reg)). */ else if (register_operand (src, word_mode)) { - if (bitsize <= GET_MODE_BITSIZE (SImode)) + if (bitsize <= 32) emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, op1, const0_rtx), src); else { /* Emit st,stcmh sequence. */ - int stcmh_width = bitsize - GET_MODE_BITSIZE (SImode); + int stcmh_width = bitsize - 32; int size = stcmh_width / BITS_PER_UNIT; emit_move_insn (adjust_address (dest, SImode, size), gen_lowpart (SImode, src)); set_mem_size (dest, size); - emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, GEN_INT - (stcmh_width), const0_rtx), - gen_rtx_LSHIFTRT (word_mode, src, GEN_INT - (GET_MODE_BITSIZE (SImode)))); + emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, + GEN_INT (stcmh_width), + const0_rtx), + gen_rtx_LSHIFTRT (word_mode, src, GEN_INT (32))); } return true; } @@ -4649,7 +4654,7 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) && register_operand (dest, mode)) { /* Emit a strict_low_part pattern if possible. */ - if (bitpos == 0 && GET_MODE_BITSIZE (smode) == bitsize) + if (smode_bsize == bitsize && bitpos == mode_bsize - smode_bsize) { op = gen_rtx_STRICT_LOW_PART (VOIDmode, gen_lowpart (smode, dest)); op = gen_rtx_SET (VOIDmode, op, gen_lowpart (smode, src)); @@ -4728,7 +4733,12 @@ init_alignment_context (struct alignment_context *ac, rtx mem, ac->aligned = (MEM_ALIGN (mem) >= GET_MODE_BITSIZE (SImode)); if (ac->aligned) - ac->memsi = adjust_address (mem, SImode, 0); /* Memory is aligned. */ + { + ac->memsi = adjust_address (mem, SImode, 0); /* Memory is aligned. */ + ac->shift = const0_rtx; + ac->modemask = GEN_INT (GET_MODE_MASK (mode)); + ac->modemaski = GEN_INT (~GET_MODE_MASK (mode)); + } else { /* Alignment is unknown. */ @@ -4755,15 +4765,17 @@ init_alignment_context (struct alignment_context *ac, rtx mem, ac->shift = expand_simple_binop (SImode, MINUS, ac->shift, byteoffset, NULL_RTX, 1, OPTAB_DIRECT); + /* Shift is the byte count, but we need the bitcount. */ + ac->shift = expand_simple_binop (SImode, ASHIFT, ac->shift, GEN_INT (3), + NULL_RTX, 1, OPTAB_DIRECT); + + /* Calculate masks. */ + ac->modemask = expand_simple_binop (SImode, ASHIFT, + GEN_INT (GET_MODE_MASK (mode)), + ac->shift, NULL_RTX, 1, OPTAB_DIRECT); + ac->modemaski = expand_simple_unop (SImode, NOT, ac->modemask, + NULL_RTX, 1); } - /* Shift is the byte count, but we need the bitcount. */ - ac->shift = expand_simple_binop (SImode, MULT, ac->shift, GEN_INT (BITS_PER_UNIT), - NULL_RTX, 1, OPTAB_DIRECT); - /* Calculate masks. */ - ac->modemask = expand_simple_binop (SImode, ASHIFT, - GEN_INT (GET_MODE_MASK (mode)), ac->shift, - NULL_RTX, 1, OPTAB_DIRECT); - ac->modemaski = expand_simple_unop (SImode, NOT, ac->modemask, NULL_RTX, 1); } /* A subroutine of s390_expand_cs_hqi. Insert INS into VAL. If possible, @@ -4781,7 +4793,7 @@ s390_two_part_insv (struct alignment_context *ac, rtx *seq1, rtx *seq2, start_sequence (); tmp = copy_to_mode_reg (SImode, val); if (s390_expand_insv (tmp, GEN_INT (GET_MODE_BITSIZE (mode)), - const0_rtx, ins)) + GEN_INT (32 - GET_MODE_BITSIZE (mode)), ins)) { *seq1 = NULL; *seq2 = get_insns ();