From patchwork Thu Sep 30 17:37:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 45616 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B50603857C51 for ; Thu, 30 Sep 2021 17:38:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B50603857C51 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1633023481; bh=1zJlxTbC9aEJFpntL171s6vOiKYN8ZuEcMLBacJxGzo=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Lb6E9DZ18gO8A+dYKoqrQ21WQcgqLEedCCC6BYiq1t+y4Fr2ILTrqk+exr2lReU1g hK+8aTcNcDst6lLAqfUT5z+8+OABxVac75jjFYNsQ7j/VhklB94Lz9Z+5YdtimDUif SL8OUoDOCnfjWCOfrGTQ5NVcftFFKnszvYnkynQw= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by sourceware.org (Postfix) with ESMTPS id 579E73858C2C for ; Thu, 30 Sep 2021 17:37:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 579E73858C2C Received: by mail-qt1-x832.google.com with SMTP id e16so6477998qts.4 for ; Thu, 30 Sep 2021 10:37:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=1zJlxTbC9aEJFpntL171s6vOiKYN8ZuEcMLBacJxGzo=; b=Ft3/o303sjIX8K+8rq+lus7eB9e+x8OAMi/A2AV6SltOqyh/y1LGDvhsMnSW68QgOG ouKiooMT7jVQKWIX0Z/7oBbEgQBASY0+2AvRB/ce1xBUzRu+WRjdzK1AZPe8v1UmFtUS z1P7KnZl62QwcqjdlCoRFaebuuuhQsfHdAeBIlWxk/XCiShMUDKUNQZjsu1vIA4ZTpHo RCk8as6BZgCjImgVoqZWSjHE7ZF2JtGD4nhObuY3n29S8qHKow1P0Eu+ffEM3c+ajFhC 7Cw0T0vr06Gk0Q1+ZxG0Vjo3sqHEgIUsCizYXd4JimoLiRCBe7cBQ3X2/NZwq2FaCqMq 8rOQ== X-Gm-Message-State: AOAM530MfW/wndW6+G/A15fpxaOkBwHZvVYLioO9TVl8yzNIEQW64fKK XsGj1DVCYbSrHXHkJY7HcnlT5EjJHp0RVuoxzFnDP+TS5TDz+A== X-Google-Smtp-Source: ABdhPJz8g8HzlCrxnwU6yFEvc/8Behcgvjl56hSyozkAQzugEhwan+thzSrAHHj+7iBXS0MTIaF8frgPw0le2kdr4Lo= X-Received: by 2002:a05:622a:492:: with SMTP id p18mr8175274qtx.282.1633023451651; Thu, 30 Sep 2021 10:37:31 -0700 (PDT) MIME-Version: 1.0 Date: Thu, 30 Sep 2021 19:37:20 +0200 Message-ID: Subject: [PATCH] i386: Eliminate sign extension after logic operation [PR89954] To: "gcc-patches@gcc.gnu.org" X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Uros Bizjak via Gcc-patches From: Uros Bizjak Reply-To: Uros Bizjak Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Convert (sign_extend:WIDE (any_logic:NARROW (memory, immediate))) to (any_logic:WIDE (sign_extend (memory)), (sign_extend (immediate))). This eliminates sign extension after logic operation. 2021-09-30 Uroš Bizjak gcc/ PR target/89954 * config/i386/i386.md (sign_extend:WIDE (any_logic:NARROW (memory, immediate)) splitters): New splitters. gcc/testsuite/ PR target/89954 * gcc.target/i386/pr89954.c: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Pushed to master. Uros. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 758d7d1e3c0..04cb3bf6a33 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -10210,6 +10210,40 @@ [(set_attr "type" "alu") (set_attr "mode" "")]) +;; convert (sign_extend:WIDE (any_logic:NARROW (memory, immediate))) +;; to (any_logic:WIDE (sign_extend (memory)), (sign_extend (immediate))). +;; This eliminates sign extension after logic operation. + +(define_split + [(set (match_operand:SWI248 0 "register_operand") + (sign_extend:SWI248 + (any_logic:QI (match_operand:QI 1 "memory_operand") + (match_operand:QI 2 "const_int_operand"))))] + "" + [(set (match_dup 3) (sign_extend:SWI248 (match_dup 1))) + (set (match_dup 0) (any_logic:SWI248 (match_dup 3) (match_dup 2)))] + "operands[3] = gen_reg_rtx (mode);") + +(define_split + [(set (match_operand:SWI48 0 "register_operand") + (sign_extend:SWI48 + (any_logic:HI (match_operand:HI 1 "memory_operand") + (match_operand:HI 2 "const_int_operand"))))] + "" + [(set (match_dup 3) (sign_extend:SWI48 (match_dup 1))) + (set (match_dup 0) (any_logic:SWI48 (match_dup 3) (match_dup 2)))] + "operands[3] = gen_reg_rtx (mode);") + +(define_split + [(set (match_operand:DI 0 "register_operand") + (sign_extend:DI + (any_logic:SI (match_operand:SI 1 "memory_operand") + (match_operand:SI 2 "const_int_operand"))))] + "TARGET_64BIT" + [(set (match_dup 3) (sign_extend:DI (match_dup 1))) + (set (match_dup 0) (any_logic:DI (match_dup 3) (match_dup 2)))] + "operands[3] = gen_reg_rtx (DImode);") + (define_insn "*_2" [(set (reg FLAGS_REG) (compare (any_or:SWI diff --git a/gcc/testsuite/gcc.target/i386/pr89954.c b/gcc/testsuite/gcc.target/i386/pr89954.c new file mode 100644 index 00000000000..c1e9f3a9562 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89954.c @@ -0,0 +1,45 @@ +/* PR target/89954 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +signed char ab; + +short aw; + +int al; + +short sext_andbw (void) { return ab & -2; } +short sext_orbw (void) { return ab | -3; } +short sext_xorbw (void) { return ab ^ -4; } + +int sext_andbl (void) { return ab & -2; } +int sext_orbl (void) { return ab | -3; } +int sext_xorbl (void) { return ab ^ -4; } + +int sext_andwl (void) { return aw & -2; } +int sext_orwl (void) { return aw | -3; } +int sext_xorwl (void) { return aw ^ -4; } + +#ifdef __x86_64__ + +long long sext_andbq (void) { return ab & -2; } +long long sext_orbq (void) { return ab | -3; } +long long sext_xorbq (void) { return ab ^ -4; } + +long long sext_andwq (void) { return aw & -2; } +long long sext_orwq (void) { return aw | -3; } +long long sext_xorwq (void) { return aw ^ -4; } + +long long sext_andlq (void) { return al & -2; } +long long sext_orlq (void) { return al | -3; } +long long sext_xorlq (void) { return al ^ -4; } + +#endif + +/* { dg-final { scan-assembler-times "movsbw" 3 } } */ +/* { dg-final { scan-assembler-times "movsbl" 3 } } */ +/* { dg-final { scan-assembler-times "movswl" 3 } } */ + +/* { dg-final { scan-assembler-times "movsbq" 3 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times "movswq" 3 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times "movslq" 3 { target { ! ia32 } } } } */