From patchwork Fri Jul 30 22:37:25 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramana Radhakrishnan X-Patchwork-Id: 60383 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 63BF2B70AA for ; Sat, 31 Jul 2010 08:37:37 +1000 (EST) Received: (qmail 8083 invoked by alias); 30 Jul 2010 22:37:35 -0000 Received: (qmail 8067 invoked by uid 22791); 30 Jul 2010 22:37:34 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, TW_QE, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 30 Jul 2010 22:37:29 +0000 Received: by wyb38 with SMTP id 38so1798097wyb.20 for ; Fri, 30 Jul 2010 15:37:27 -0700 (PDT) Received: by 10.216.12.70 with SMTP id 48mr176017wey.105.1280529447148; Fri, 30 Jul 2010 15:37:27 -0700 (PDT) Received: from [192.168.1.100] (66.37.187.81.in-addr.arpa [81.187.37.66]) by mx.google.com with ESMTPS id w14sm1478455weq.9.2010.07.30.15.37.26 (version=SSLv3 cipher=RC4-MD5); Fri, 30 Jul 2010 15:37:26 -0700 (PDT) Subject: [Patch ARM] 4.5.x Fix PR43698 in 4.5 branch. From: Ramana Radhakrishnan To: gcc-patches@gcc.gnu.org Cc: richard.guenther@gmail.com, rearnsha@arm.com Date: Fri, 30 Jul 2010 23:37:25 +0100 Message-ID: <1280529445.14873.40.camel@numenor> Mime-Version: 1.0 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 Hi, This patch backports the fix for PR43698 which only affects the ARM port into the 4.5 branch. I've tested this on a cross to arm-linux-gnueabi on qemu for armv7-a for ARM and Thumb state and found no regressions. Richi approved this backport to 4.5 branch on IRC and I've now committed this to the 4.5 branch so that this is a part of 4.5.1. Thanks, Ramana 2010-07-30 Ramana Radhakrishnan Backport from mainline. 2010-07-22 Ramana Radhakrishnan PR target/43698 * config/arm/arm.md: Split arm_rev into *arm_rev and *thumb1_rev. Set *arm_rev to be predicable. 2010-07-30 Ramana Radhakrishnan Backport from mainline 2010-07-22 Ramana Radhakrishnan PR target/43698 * gcc.target/arm/pr43698.c: New test. Index: gcc/config/arm/arm.md =================================================================== --- gcc/config/arm/arm.md (revision 162710) +++ gcc/config/arm/arm.md (working copy) @@ -11197,15 +11197,21 @@ (define_insn "*arm_movtas_ze" (set_attr "length" "4")] ) -(define_insn "arm_rev" +(define_insn "*arm_rev" [(set (match_operand:SI 0 "s_register_operand" "=r") (bswap:SI (match_operand:SI 1 "s_register_operand" "r")))] - "TARGET_EITHER && arm_arch6" - "rev\t%0, %1" - [(set (attr "length") - (if_then_else (eq_attr "is_thumb" "yes") - (const_int 2) - (const_int 4)))] + "TARGET_32BIT && arm_arch6" + "rev%?\t%0, %1" + [(set_attr "predicable" "yes") + (set_attr "length" "4")] +) + +(define_insn "*thumb1_rev" + [(set (match_operand:SI 0 "s_register_operand" "=l") + (bswap:SI (match_operand:SI 1 "s_register_operand" "l")))] + "TARGET_THUMB1 && arm_arch6" + "rev\t%0, %1" + [(set_attr "length" "2")] ) (define_expand "arm_legacy_rev" --- /dev/null 2010-07-29 22:03:00.984228903 +0100 +++ ./pr43698.c 2010-07-27 19:11:25.000000000 +0100 @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-Os -march=armv7-a" } */ +#include +#include + + +char do_reverse_endian = 0; + +# define bswap_32(x) \ + ((((x) & 0xff000000) >> 24) | \ + (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x000000ff) << 24)) + +#define EGET(X) \ + (__extension__ ({ \ + uint64_t __res; \ + if (!do_reverse_endian) { __res = (X); \ + } else if (sizeof(X) == 4) { __res = bswap_32((X)); \ + } \ + __res; \ + })) + +void __attribute__((noinline)) X(char **phdr, char **data, int *phoff) +{ + *phdr = *data + EGET(*phoff); +} + +int main() +{ + char *phdr; + char *data = (char *)0x40164000; + int phoff = 0x34; + X(&phdr, &data, &phoff); + if (phdr != (char *)0x40164034) + abort (); + exit (0); +}