From patchwork Fri Dec 8 13:20:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Perta X-Patchwork-Id: 846222 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-468784-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="bp0fR4MU"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ytXyw635sz9s74 for ; Sat, 9 Dec 2017 00:20:17 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=kPGuKR4/qRtu295m +ME0WtpmggL24AJJabl3yPFz3rdouIU24BF1TgeE69ylQZG3I/oB0PKLRJZjkV2h vqfTka7UKLDxlWQxM9TMglB6A+SPfjxwV8JplmcRHeccOxZ7dFLRxvPos0gIhnk3 YL2y7EQ10+yjO6ytlrc1ogGX/u8= 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:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=JMx4RznmlgrdPrbyBOm9xY Haf14=; b=bp0fR4MUYApxlEImPowhF5u65oqfDqoj2Ra2NL9Bry2Jvn2p49K8b7 8v4j47g2x2i1bKxnXV+e6tM5N7kz7/uZR4q0yPm75rxUaJuAOFKLapoY7+2LIHtE ul5IrTR8EJHrvpuyFTaCJGSxOSqpPbgtwEh2T/FSwJh7n/5I39UOI= Received: (qmail 118318 invoked by alias); 8 Dec 2017 13:20:09 -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 114631 invoked by uid 89); 8 Dec 2017 13:20:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: relmlie1.idc.renesas.com Received: from relmlor2.renesas.com (HELO relmlie1.idc.renesas.com) (210.160.252.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 08 Dec 2017 13:20:05 +0000 Received: from unknown (HELO relmlir4.idc.renesas.com) ([10.200.68.154]) by relmlie1.idc.renesas.com with ESMTP; 08 Dec 2017 22:20:02 +0900 Received: from relmlii2.idc.renesas.com (relmlii2.idc.renesas.com [10.200.68.66]) by relmlir4.idc.renesas.com (Postfix) with ESMTP id 3995C8A544 for ; Fri, 8 Dec 2017 22:20:02 +0900 (JST) Received: from unknown (HELO REEBED03978) ([10.226.37.54]) by relmlii2.idc.renesas.com with ESMTP; 08 Dec 2017 22:20:01 +0900 From: "Sebastian Perta" To: Subject: [PATCH] rl78 umindi3 improvement Date: Fri, 8 Dec 2017 13:20:00 -0000 Message-ID: <000601d37027$40e2d7c0$c2a88740$@renesas.com> MIME-Version: 1.0 Hello, The following patch improves both the speed and code size for 64 bit unsigned min for RL78: it emits a library function call instead of emitting code for the 64 bit min for every single time. The unsigned min function which was added in libgcc is hand written, so more optimal than what GCC generates. The change can easily be seen on the following test case: unsigned long long my_smaxdi3(unsigned long long x, unsigned long long y){ return (x < y)? x : y; } I did not add this to the regression as it very simple and there are test cases in the regression which test this, for example gcc.c-torture/execute/pr49039.c and gcc.dg/torture/pr25718-1.c. Regression test is OK, tested with the following command: make -k check-gcc RUNTESTFLAGS=--target_board=rl78-sim Please let me know if this is OK, Thank you! Sebastian +END_FUNC ___umindi3 Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 255471) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,7 @@ +2017-12-07 Sebastian Perta + + * config/rl78/rl78.md: New define_expand "umindi3". + 2017-12-07 Vladimir Makarov PR target/83252 Index: gcc/config/rl78/rl78.md =================================================================== --- gcc/config/rl78/rl78.md (revision 255471) +++ gcc/config/rl78/rl78.md (working copy) @@ -234,6 +234,16 @@ DONE;" ) +(define_expand "umindi3" + [(set (match_operand:DI 0 "nonimmediate_operand" "") + (umin:DI (match_operand:DI 1 "general_operand" "") + (match_operand:DI 2 "general_operand" ""))) + ] + "optimize_size" + "rl78_emit_libcall (\"__umindi3\", UMIN, DImode, DImode, 3, operands); + DONE;" +) + (define_insn "addsi3_internal_virt" [(set (match_operand:SI 0 "nonimmediate_operand" "=v,&vm, vm") (plus:SI (match_operand:SI 1 "general_operand" "0, vim, vim") Index: libgcc/ChangeLog =================================================================== --- libgcc/ChangeLog (revision 255471) +++ libgcc/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2017-12-07 Sebastian Perta + + * config/rl78/umindi3.S: New assembly file. + * config/rl78/t-rl78: Added umindi3.S to LIB2ADD. + 2017-11-30 Michael Meissner * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration. Index: libgcc/config/rl78/t-rl78 =================================================================== --- libgcc/config/rl78/t-rl78 (revision 255471) +++ libgcc/config/rl78/t-rl78 (working copy) @@ -32,7 +32,8 @@ $(srcdir)/config/rl78/fpmath-sf.S \ $(srcdir)/config/rl78/cmpsi2.S \ $(srcdir)/config/rl78/adddi3.S \ - $(srcdir)/config/rl78/subdi3.S + $(srcdir)/config/rl78/subdi3.S \ + $(srcdir)/config/rl78/umindi3.S LIB2FUNCS_EXCLUDE = _clzhi2 _clzsi2 _ctzhi2 _ctzsi2 \ _popcounthi2 _popcountsi2 \ Index: libgcc/config/rl78/umindi3.S =================================================================== --- libgcc/config/rl78/umindi3.S (nonexistent) +++ libgcc/config/rl78/umindi3.S (working copy) @@ -0,0 +1,74 @@ +; Copyright (C) 2017 Free Software Foundation, Inc. +; Contributed by Sebastian Perta. +; +; This file is free software; you can redistribute it and/or modify it +; under the terms of the GNU General Public License as published by the +; Free Software Foundation; either version 3, or (at your option) any +; later version. +; +; This file is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; General Public License for more details. +; +; Under Section 7 of GPL version 3, you are granted additional +; permissions described in the GCC Runtime Library Exception, version +; 3.1, as published by the Free Software Foundation. +; +; You should have received a copy of the GNU General Public License and +; a copy of the GCC Runtime Library Exception along with this program; +; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +; . + + +#include "vregs.h" + + .text + +START_FUNC ___umindi3 + + ; copy first argument/operand to the output registers + movw ax, [sp+4] + movw r8, ax + movw ax, [sp+6] + movw r10, ax + movw ax, [sp+8] + movw r12, ax + movw ax, [sp+10] + movw r14, ax + + ; use 16-bit compares from the most significant words downto the least significant ones + movw ax, [sp+18] + cmpw ax, r14 + bc $.L1 + bnz $.L2 + + movw ax, [sp+16] + cmpw ax, r12 + bc $.L1 + bnz $.L2 + + movw ax, [sp+14] + cmpw ax, r10 + bc $.L1 + bnz $.L2 + + movw ax, [sp+12] + cmpw ax, r8 + bc $.L1 + ret + +.L1: + ; copy second argument/operand to the output registers + movw ax, [sp+12] + movw r8, ax + movw ax, [sp+14] + movw r10, ax + movw ax, [sp+16] + movw r12, ax + movw ax, [sp+18] + movw r14, ax +.L2: + ret +