From patchwork Wed Sep 26 05:03:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 147530 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp261748lji; Tue, 25 Sep 2018 22:04:27 -0700 (PDT) X-Google-Smtp-Source: ACcGV621FluA4dKBrAA/Sa4cs1yLcZv2gPIXGVuhEAypW6jIZj2M6olFaZJV1Oha3zdIukdHJ489 X-Received: by 2002:a17:902:7582:: with SMTP id j2-v6mr4241715pll.76.1537938267834; Tue, 25 Sep 2018 22:04:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537938267; cv=none; d=google.com; s=arc-20160816; b=vsQS7h4GuS94b0PR6YJNkyJ5Bid9sIlxA/dXAoyxipeHgH7Mub/JEj08amF86xEnOh 905mKIaoAA+nc5UvqNVfyDbzTAYHA89A3lkJgRBIcAB3rwuqLxz0IDwF7jaBS6SvXqrn fs0J/DUAciHyxzBGq0OrwMz/eMw05BqiYJASiw6SNR0pfG7+dfVBKlsT8anMWcDn85VW H4NFHRALCDRno7n/vFYyQBX3mzemhA5LuqRSmVFnZ0rrWRJCMDt0hcvPzM3ZsJm/divI uUcHYWVTnZLQvIU2Bjph79wF2SroSPdwGRh/dCFIU3ai8AvszTpn2/T+mQmVaJEfBRY2 IhBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:delivered-to:sender:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature; bh=cin/6XGuq0N7oyvdplZ6DmFp6FFNR5fv/rt1O8GI6R4=; b=I+t8Mo+x/KAp7KoPTJTTaQkfcIMRlBqseW7GVvqWn6H3e6KARQkR1YAXwz1Dkg8tau SYednN1LCGXpMsjOA/2JHB6yZKfzsZvBpT2hK55tb41KhvLi0RpxVkQqmjbTJi+jPeGT vpw82ue4J92K83UCgFy8+0v/E1sbmLUtCEvUMH9AIvtVeeu9qSyzb3wBVbdNxi4Vq85p j6XUgTqS8GJKUUgTlu+L0VV3gzZfU1iUSLRp/eCbTZ86OlZRIbeTLhkH1JivwkPkils+ KIuPG5LiKFVK+w8CMMNKtKx/iVg7j/lDRaCzcqhT3/8YF3AFWMm/Nq2+5HtIRUuXYHRT humg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=O2ANFdOw; dkim=pass header.i=@gmail.com header.s=20161025 header.b=sfSai5IX; spf=pass (google.com: domain of gcc-patches-return-486383-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="gcc-patches-return-486383-patch=linaro.org@gcc.gnu.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id i5-v6si4278925pgk.200.2018.09.25.22.04.27 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Sep 2018 22:04:27 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-486383-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=O2ANFdOw; dkim=pass header.i=@gmail.com header.s=20161025 header.b=sfSai5IX; spf=pass (google.com: domain of gcc-patches-return-486383-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="gcc-patches-return-486383-patch=linaro.org@gcc.gnu.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com 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:cc:subject:date:message-id:in-reply-to:references; q=dns; s= default; b=xA1AnRX3rJfUXvkP7O31c0NB8hngDu62w4SA88cxu3jTNiBozpaly cDtf6mzwS2PgEVAx4O8FNoArYyfeiTh3fbGqvnQ+GwVuVn25SNH4nB3EqnqwFzzO L6vZNdD8LGkvEdU9sKhDKwDhP6+Fc3i8/PhuyiK/yB6yDtdltq9IcU= 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:cc:subject:date:message-id:in-reply-to:references; s= default; bh=WYbHx0bZempF3gY7VFq8YuAREAk=; b=O2ANFdOwfu6/qV8TZ0cR M38pQeFnDdpLVGZyA5KgzfwJF/utQa5rUrG+A/+Vg+5ytdAio2f6whWZTpbVpvvK FAacW1PaDUZytzZcZ8Z50wC1N+k/L7milyoo1voUK2DIsQXyuXG+CQXW+GQBetmg Kw1hKo2AiEjnpQuPJDldGTY= Received: (qmail 73332 invoked by alias); 26 Sep 2018 05:04:03 -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 73190 invoked by uid 89); 26 Sep 2018 05:04:02 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=alli, casa, modes X-HELO: mail-pf1-f180.google.com Received: from mail-pf1-f180.google.com (HELO mail-pf1-f180.google.com) (209.85.210.180) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 26 Sep 2018 05:04:00 +0000 Received: by mail-pf1-f180.google.com with SMTP id p12-v6so12789998pfh.2 for ; Tue, 25 Sep 2018 22:04:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cin/6XGuq0N7oyvdplZ6DmFp6FFNR5fv/rt1O8GI6R4=; b=sfSai5IX060PPDKJaL2g8QcmfYNUbioNSYkSeNCPIBijvpFFngd97Fk9w2TDT6PDC7 MyXAl4vaMhXdFpAsclMRSd3e6pN2NYeclas+lPaKoSU1U6MWfvv39jVri/Ozn2/D/59S qC1yzfobMuyC38fvlzBm4ltOuWnGoYmMvmtsPFMwRO8UZLg/L9iq8dpUF2BCfbXRASqr pJkro0OoWgNX6rZLtrwhdXqm0sGcNhsyAj1wEXIXXPdPt6qWyKBPME50xAx0EBz6uktL FzrA14MPx0E5/T9ejTkKoPMZ7DW9YxoIJIEnAy0Fq/P383olPRfsGV5R93LHi8SQF7k/ 20TQ== Return-Path: Received: from cloudburst.twiddle.net (97-113-8-179.tukw.qwest.net. [97.113.8.179]) by smtp.gmail.com with ESMTPSA id j22-v6sm4954650pfh.45.2018.09.25.22.03.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 25 Sep 2018 22:03:57 -0700 (PDT) From: rth7680@gmail.com To: gcc-patches@gcc.gnu.org Cc: ramana.radhakrishnan@arm.com, agraf@suse.de, matz@suse.de, Richard Henderson Subject: [PATCH, AArch64 01/11] aarch64: Simplify LSE cas generation Date: Tue, 25 Sep 2018 22:03:45 -0700 Message-Id: <20180926050355.32746-2-richard.henderson@linaro.org> In-Reply-To: <20180926050355.32746-1-richard.henderson@linaro.org> References: <20180926050355.32746-1-richard.henderson@linaro.org> From: Richard Henderson The cas insn is a single insn, and if expanded properly need not be split after reload. Use the proper inputs for the insn. * config/aarch64/aarch64.c (aarch64_expand_compare_and_swap): Force value into a register for TARGET_LSE; avoid register overlap between rval and oldval, in case the compare is needed; emit the compare during initial expansion so that it may be deleted if unused. (aarch64_gen_atomic_cas): Remove. * config/aarch64/atomics.md (@aarch64_compare_and_swap_lse): Remove & from operand 0; use matching constraint for operand 2; remove is_weak and mod_f operands as unused. Drop the split and merge with... (@aarch64_atomic_cas): ... this pattern's output; remove. (@aarch64_compare_and_swap_lse): Similarly. (@aarch64_atomic_cas): Similarly. --- gcc/config/aarch64/aarch64-protos.h | 1 - gcc/config/aarch64/aarch64.c | 41 +++------- gcc/config/aarch64/atomics.md | 117 ++++++++-------------------- 3 files changed, 41 insertions(+), 118 deletions(-) -- 2.17.1 diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index caf1d2041f0..3d045cf43be 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -562,7 +562,6 @@ rtx aarch64_load_tp (rtx); void aarch64_expand_compare_and_swap (rtx op[]); void aarch64_split_compare_and_swap (rtx op[]); -void aarch64_gen_atomic_cas (rtx, rtx, rtx, rtx, rtx); bool aarch64_atomic_ldop_supported_p (enum rtx_code); void aarch64_gen_atomic_ldop (enum rtx_code, rtx, rtx, rtx, rtx, rtx); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 12f7dfe9a75..a0ba358c2f1 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -14174,7 +14174,7 @@ aarch64_expand_compare_and_swap (rtx operands[]) case E_SImode: case E_DImode: /* Force the value into a register if needed. */ - if (!aarch64_plus_operand (oldval, mode)) + if (TARGET_LSE || !aarch64_plus_operand (oldval, mode)) oldval = force_reg (cmp_mode, oldval); break; @@ -14183,16 +14183,20 @@ aarch64_expand_compare_and_swap (rtx operands[]) } if (TARGET_LSE) - emit_insn (gen_aarch64_compare_and_swap_lse (mode, rval, mem, oldval, - newval, is_weak, mod_s, - mod_f)); + { + if (reg_overlap_mentioned_p (rval, oldval)) + rval = gen_reg_rtx (cmp_mode); + emit_insn (gen_aarch64_compare_and_swap_lse (mode, rval, mem, oldval, + newval, mod_s)); + aarch64_gen_compare_reg (EQ, rval, oldval); + } else emit_insn (gen_aarch64_compare_and_swap (mode, rval, mem, oldval, newval, is_weak, mod_s, mod_f)); - if (mode == QImode || mode == HImode) - emit_move_insn (operands[1], gen_lowpart (mode, rval)); + rval = gen_lowpart (mode, rval); + emit_move_insn (operands[1], rval); x = gen_rtx_REG (CCmode, CC_REGNUM); x = gen_rtx_EQ (SImode, x, const0_rtx); @@ -14242,31 +14246,6 @@ aarch64_emit_post_barrier (enum memmodel model) } } -/* Emit an atomic compare-and-swap operation. RVAL is the destination register - for the data in memory. EXPECTED is the value expected to be in memory. - DESIRED is the value to store to memory. MEM is the memory location. MODEL - is the memory ordering to use. */ - -void -aarch64_gen_atomic_cas (rtx rval, rtx mem, - rtx expected, rtx desired, - rtx model) -{ - machine_mode mode; - - mode = GET_MODE (mem); - - /* Move the expected value into the CAS destination register. */ - emit_insn (gen_rtx_SET (rval, expected)); - - /* Emit the CAS. */ - emit_insn (gen_aarch64_atomic_cas (mode, rval, mem, desired, model)); - - /* Compare the expected value with the value loaded by the CAS, to establish - whether the swap was made. */ - aarch64_gen_compare_reg (EQ, rval, expected); -} - /* Split a compare and swap pattern. */ void diff --git a/gcc/config/aarch64/atomics.md b/gcc/config/aarch64/atomics.md index bba8e9e9c8e..9f00dd3c68e 100644 --- a/gcc/config/aarch64/atomics.md +++ b/gcc/config/aarch64/atomics.md @@ -85,56 +85,50 @@ } ) -(define_insn_and_split "@aarch64_compare_and_swap_lse" - [(set (reg:CC CC_REGNUM) ;; bool out - (unspec_volatile:CC [(const_int 0)] UNSPECV_ATOMIC_CMPSW)) - (set (match_operand:SI 0 "register_operand" "=&r") ;; val out +(define_insn "@aarch64_compare_and_swap_lse" + [(set (match_operand:SI 0 "register_operand" "=r") ;; val out (zero_extend:SI - (match_operand:SHORT 1 "aarch64_sync_memory_operand" "+Q"))) ;; memory + (match_operand:SHORT 1 "aarch64_sync_memory_operand" "+Q"))) ;; memory (set (match_dup 1) (unspec_volatile:SHORT - [(match_operand:SI 2 "aarch64_plus_operand" "rI") ;; expected + [(match_operand:SI 2 "register_operand" "0") ;; expected (match_operand:SHORT 3 "aarch64_reg_or_zero" "rZ") ;; desired - (match_operand:SI 4 "const_int_operand") ;; is_weak - (match_operand:SI 5 "const_int_operand") ;; mod_s - (match_operand:SI 6 "const_int_operand")] ;; mod_f + (match_operand:SI 4 "const_int_operand")] ;; mod_s UNSPECV_ATOMIC_CMPSW))] "TARGET_LSE" - "#" - "&& reload_completed" - [(const_int 0)] - { - aarch64_gen_atomic_cas (operands[0], operands[1], - operands[2], operands[3], - operands[5]); - DONE; - } -) +{ + enum memmodel model = memmodel_from_int (INTVAL (operands[4])); + if (is_mm_relaxed (model)) + return "cas\t%0, %3, %1"; + else if (is_mm_acquire (model) || is_mm_consume (model)) + return "casa\t%0, %3, %1"; + else if (is_mm_release (model)) + return "casl\t%0, %3, %1"; + else + return "casal\t%0, %3, %1"; +}) -(define_insn_and_split "@aarch64_compare_and_swap_lse" - [(set (reg:CC CC_REGNUM) ;; bool out - (unspec_volatile:CC [(const_int 0)] UNSPECV_ATOMIC_CMPSW)) - (set (match_operand:GPI 0 "register_operand" "=&r") ;; val out +(define_insn "@aarch64_compare_and_swap_lse" + [(set (match_operand:GPI 0 "register_operand" "=r") ;; val out (match_operand:GPI 1 "aarch64_sync_memory_operand" "+Q")) ;; memory (set (match_dup 1) (unspec_volatile:GPI - [(match_operand:GPI 2 "aarch64_plus_operand" "rI") ;; expect + [(match_operand:GPI 2 "register_operand" "0") ;; expect (match_operand:GPI 3 "aarch64_reg_or_zero" "rZ") ;; desired - (match_operand:SI 4 "const_int_operand") ;; is_weak - (match_operand:SI 5 "const_int_operand") ;; mod_s - (match_operand:SI 6 "const_int_operand")] ;; mod_f + (match_operand:SI 4 "const_int_operand")] ;; mod_s UNSPECV_ATOMIC_CMPSW))] "TARGET_LSE" - "#" - "&& reload_completed" - [(const_int 0)] - { - aarch64_gen_atomic_cas (operands[0], operands[1], - operands[2], operands[3], - operands[5]); - DONE; - } -) +{ + enum memmodel model = memmodel_from_int (INTVAL (operands[4])); + if (is_mm_relaxed (model)) + return "cas\t%0, %3, %1"; + else if (is_mm_acquire (model) || is_mm_consume (model)) + return "casa\t%0, %3, %1"; + else if (is_mm_release (model)) + return "casl\t%0, %3, %1"; + else + return "casal\t%0, %3, %1"; +}) (define_expand "atomic_exchange" [(match_operand:ALLI 0 "register_operand" "") @@ -610,55 +604,6 @@ return "swpal\t%2, %0, %1"; }) -;; Atomic compare-and-swap: HI and smaller modes. - -(define_insn "@aarch64_atomic_cas" - [(set (match_operand:SI 0 "register_operand" "+&r") ;; out - (zero_extend:SI - (match_operand:SHORT 1 "aarch64_sync_memory_operand" "+Q"))) ;; memory. - (set (match_dup 1) - (unspec_volatile:SHORT - [(match_dup 0) - (match_operand:SHORT 2 "aarch64_reg_or_zero" "rZ") ;; value. - (match_operand:SI 3 "const_int_operand" "")] ;; model. - UNSPECV_ATOMIC_CAS))] - "TARGET_LSE && reload_completed" -{ - enum memmodel model = memmodel_from_int (INTVAL (operands[3])); - if (is_mm_relaxed (model)) - return "cas\t%0, %2, %1"; - else if (is_mm_acquire (model) || is_mm_consume (model)) - return "casa\t%0, %2, %1"; - else if (is_mm_release (model)) - return "casl\t%0, %2, %1"; - else - return "casal\t%0, %2, %1"; -}) - -;; Atomic compare-and-swap: SI and larger modes. - -(define_insn "@aarch64_atomic_cas" - [(set (match_operand:GPI 0 "register_operand" "+&r") ;; out - (match_operand:GPI 1 "aarch64_sync_memory_operand" "+Q")) ;; memory. - (set (match_dup 1) - (unspec_volatile:GPI - [(match_dup 0) - (match_operand:GPI 2 "aarch64_reg_or_zero" "rZ") ;; value. - (match_operand:SI 3 "const_int_operand" "")] ;; model. - UNSPECV_ATOMIC_CAS))] - "TARGET_LSE && reload_completed" -{ - enum memmodel model = memmodel_from_int (INTVAL (operands[3])); - if (is_mm_relaxed (model)) - return "cas\t%0, %2, %1"; - else if (is_mm_acquire (model) || is_mm_consume (model)) - return "casa\t%0, %2, %1"; - else if (is_mm_release (model)) - return "casl\t%0, %2, %1"; - else - return "casal\t%0, %2, %1"; -}) - ;; Atomic load-op: Load data, operate, store result, keep data. (define_insn "@aarch64_atomic_load"