From patchwork Mon Nov 26 14:40:13 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 201705 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 A84712C0085 for ; Tue, 27 Nov 2012 01:40:41 +1100 (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=1354545642; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:Sender:Delivered-To; bh=kYDTTSLUVW9czT/Ark7D O6MbbNw=; b=jeYYQZX1YeCxhaZIddqRf34RPWQTmJwQZHQpYUxIc/3UB80CjAfB 1kTV04NAwYc0SQGgXq3RFQyUoVEmm8KsPgyqBUuTKlkhkZoJYQtX8DCWPdPN1x7d +txwOaEVvD20VQDvgviIyXO65jykuo+Peo3v/F6jMpY9bC+jHa8XNqo= 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:From:To:Cc:Subject:Date:Message-ID:MIME-Version:X-MC-Unique:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=I/H//jiogDVPbwZKgstYRGRnpLDAogBS8Ot049HxVTDnMWeN2B9PBmGEZ7ZpCO UAfBdkgx0yAaSjWPJQCgPCUzFoCvcxaNGi3KrZwb31fkqAuzqQMLtKSgKR/dF+MU viD620zqH6+79fa6V/1GP/pbRVz18HeDpMKn38AmxKfIc=; Received: (qmail 29502 invoked by alias); 26 Nov 2012 14:40:35 -0000 Received: (qmail 29397 invoked by uid 22791); 26 Nov 2012 14:40:34 -0000 X-SWARE-Spam-Status: No, hits=-0.9 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, MSGID_MULTIPLE_AT, RCVD_IN_DNSWL_LOW, TW_VF, TW_XN X-Spam-Check-By: sourceware.org Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Nov 2012 14:40:28 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Mon, 26 Nov 2012 14:40:27 +0000 Received: from e106372vm ([10.1.255.212]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.0); Mon, 26 Nov 2012 14:40:25 +0000 From: "Kyrylo Tkachov" To: Cc: "'Ramana Radhakrishnan'" , "Richard Earnshaw" Subject: [PATCH][ARM] AArch32 vmaxnm, vminnm support Date: Mon, 26 Nov 2012 14:40:13 -0000 Message-ID: <000601cdcbe3$f1f8edd0$d5eac970$@tkachov@arm.com> MIME-Version: 1.0 X-MC-Unique: 112112614402704201 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 all, This patch adds support for the AArch32 vmaxnm and vminnm VFP instructions in that can be used to implement the smax[sf,df]3 and smin[sf,df]3 RTL patterns. The patterns are only used by gcc when unsafe math optimisations are turned on. Two new values for the type attribute are introduced: f_minmaxs and f_minmaxd. New compilation tests are added. They pass and no regressions on arm-none-eabi. Ok for trunk? Thanks, Kyrill gcc/ChangeLog 2012-11-26 Kyrylo Tkachov * config/arm/arm.md (f_minmaxs, f_minmaxd): New types. * config/arm/vfp.md (smax3): New pattern. (smin3): Likewise. gcc/testsuite/ChangeLog 2012-11-26 Kyrylo Tkachov * gcc.target/arm/vmaxnmdf.c: New test. * gcc.target/arm/vmaxnmsf.c: Likewise. * gcc.target/arm/vminnmsf.c: Likewise. * gcc.target/arm/vminnmdf.c: Likewise. --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -274,6 +274,8 @@ fmacd,\ f_rints,\ f_rintd,\ + f_minmaxs,\ + f_minmaxd,\ f_flag,\ f_loads,\ f_loadd,\ diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index 480a88d..82b277a 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -1263,6 +1263,31 @@ (set_attr "type" "f_rint")] ) +;; MIN_EXPR and MAX_EXPR eventually map to 'smin' and 'smax' in RTL. +;; The 'smax' and 'smin' RTL standard pattern names do not specify which +;; operand will be returned when both operands are zero (i.e. they may not +;; honour signed zeroes), or when either operand is NaN. Therefore GCC +;; only introduces MIN_EXPR/MAX_EXPR in fast math mode or when not honouring +;; NaNs. + +(define_insn "smax3" + [(set (match_operand:SDF 0 "register_operand" "=") + (smax:SDF (match_operand:SDF 1 "register_operand" "") + (match_operand:SDF 2 "register_operand" "")))] + "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 " + "vmaxnm.\\t%0, %1, %2" + [(set_attr "type" "f_minmax")] +) + +(define_insn "smin3" + [(set (match_operand:SDF 0 "register_operand" "=") + (smin:SDF (match_operand:SDF 1 "register_operand" "") + (match_operand:SDF 2 "register_operand" "")))] + "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 " + "vminnm.\\t%0, %1, %2" + [(set_attr "type" "f_minmax")] +) + ;; Unimplemented insns: ;; fldm* ;; fstm* diff --git a/gcc/testsuite/gcc.target/arm/vmaxnmdf.c b/gcc/testsuite/gcc.target/arm/vmaxnmdf.c new file mode 100644 index 0000000..1a172b8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vmaxnmdf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_vfp_ok } */ +/* { dg-options "-ffast-math" } */ +/* { dg-add-options arm_v8_vfp } */ + +double +foo (double x, double y) +{ + return __builtin_fmax (x, y); +} + +/* { dg-final { scan-assembler-times "vmaxnm.f64\td\[0-9\]+" 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/vmaxnmsf.c b/gcc/testsuite/gcc.target/arm/vmaxnmsf.c new file mode 100644 index 0000000..bc23261 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vmaxnmsf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_vfp_ok } */ +/* { dg-options "-ffast-math" } */ +/* { dg-add-options arm_v8_vfp } */ + +float +foo (float x, float y) +{ + return __builtin_fmaxf (x, y); +} + +/* { dg-final { scan-assembler-times "vmaxnm.f32\ts\[0-9\]+" 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/vminnmdf.c b/gcc/testsuite/gcc.target/arm/vminnmdf.c new file mode 100644 index 0000000..c2a6915 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vminnmdf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_vfp_ok } */ +/* { dg-options "-ffast-math" } */ +/* { dg-add-options arm_v8_vfp } */ + +double +foo (double x, double y) +{ + return __builtin_fmin (x, y); +} + +/* { dg-final { scan-assembler-times "vminnm.f64\td\[0-9\]+" 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/vminnmsf.c b/gcc/testsuite/gcc.target/arm/vminnmsf.c new file mode 100644 index 0000000..eee43bc --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vminnmsf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_vfp_ok } */ +/* { dg-options "-ffast-math" } */ +/* { dg-add-options arm_v8_vfp } */ + +float +foo (float x, float y) +{ + return __builtin_fminf (x, y); +} + +/* { dg-final { scan-assembler-times "vminnm.f32\ts\[0-9\]+" 1 } } */